2016-10-11 2 views
0

これは表示されません。以前はODBCクラスを使用していませんでしたが、基本的な使用には何も特別なものはありませんでした。そして、この場合を除いて動作します。OdbcDataReaderでSPの結果を読み取ると、エラー22018 - 割り当てのエラーが発生する

ODBC接続を介してパラメータなしでストアドプロシージャを実行し、結果を取得し、行をオブジェクトに解析してローカルDBに挿入する必要があります。テストデータで動作しましたが、実際のデータでは失敗しますが、顧客は他のツールを使用して同じPSを実行することができます...実際の問題は、ライブサーバーで実行する必要があるため、代わりに、TextBoxに出力を書き込む小さなプロジェクトを作成しました。とにかく、コードは次のとおりです。

var ODBCConnection = new OdbcConnection(); 
ODBCConnection.ConnectionString = "something..."; 
//using command "exec schema.spName" or "exec schema.spName()" or "{ call schema.spName()}" runs the procedure 
//putting only name "schema.spName" gives ERROR [42000] 
    var cmd = new OdbcCommand("exec schema.spName())", ODBCConnection); 
    cmd.CommandType = CommandType.StoredProcedure; 
    DbReader = cmd.ExecuteReader(); 

int fCount = DbReader.FieldCount; 
infoBox1.Text += System.Environment.NewLine + "Results:"; 
for (int i = 0; i < fCount; i++) 
{ 
    String fName = DbReader.GetName(i); 
    infoBox1.Text += fName + "|"; 
} 

この結果、結果にはすべての列名がリストされ、20個の列があります。

while (DbReader.Read()) 
{ 
var row = new RowClass(); 
    for (int i = 0; i < fCount; i++) 
    { 
     object val = DbReader.GetValue(i); 
     //check which column this is and parse it to set properties of RowClass 
     //Expected values are string, int and decimal 
    } 
} 

これは最初の10行が、休憩、それはエラーで列を次のために読み取ろうとするために動作します:

ERROR [22018] [Cache ODBC][State : 22005][Native Code 22005] 
[path to .exe] 
Error in assignment 

ノーのStackTraceなしのInnerException。

最初に10列目をスキップしようとしましたが、最初の10列目以降はすべての列が壊れていました。 私は偶然です...読み込んだ場合、20フィールドがあります...ヌル値は問題ではありませんDBNullを返しますが、他の場所でも動作します(SPではなくselectクエリを実行します)。

クライアントは同じネット環境からsp connectinを実行し、picshotとcsvのデータを送信します。データそのものには何も起きません。

誰でもこれを前に持っていましたか? OdbcDataReaderの代わりに何か他のものを使うべきですか?

ありがとうございます。

+0

.NETとSQL Serverでは、SqlClientが使用するのに最適なプロバイダです。 –

+0

SQLに直接アクセスせずに使用できますか?私はOdbcConnectionが通信する必要があると思ったので、クライアント側の管理者はODBC Administratorを使って接続を設定しました。接続文字列は 'Dsn = name; 'で始まります –

+0

SqlClientでODBC DSNを使用することはできません。代わりに、サーバー、データベース、および認証の設定を外部DSNの依存関係なしで直接接続文字列に指定します。 –

答えて

0

私は、ブラウザのSQLツールで同じ手順を実行していた顧客管理者のおかげで、わかりました。そこでは、第11列がタイプDateであることがわかりました。 ODBCはその列にタイプINTを返しました。だから、私はODBCをセットアップした別の管理者に電話をかけなければならなかったので、カラムタイプをvarcharに変更しました。

間違った列の種類が後続のすべての列を読み取ることができなくなった場合、DataReaderの動作を前提とすることができます。

私自身の答えを受け入れる気がしないので、ODBCがどのように動作し、どのようにして使用するのかについての人に少しでも親切であれば、それを使用する方法だけでなく、この種の間違いでこの動作が説明されています。

関連する問題