好的,我没有得到这个。我之前没有使用过ODBC类,但认为它对于基本用途没什么特别之处。除了这种情况外,它确实有效。
我需要通过ODBC连接执行没有参数的存储过程并获取结果,将行解析为对象并将它们插入到我的本地数据库中。它与测试数据一起工作,但现在使用实时数据失败,而客户可以通过其他工具执行相同的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。
我尝试跳过第11列,因为它从那里开始,但在前10列之后每列都中断。 我很无能......如果它读取有20个字段然后wtf ...空值没有问题,因为它返回DBNull,它适用于其他地方(不执行SP但执行选择查询)。
客户端从同一网络环境执行sp connectin并向我发送picshot和csv数据。数据本身没有任何影响。
以前有人这么做过吗?我应该使用其他东西代替OdbcDataReader吗?
谢谢。
答案 0 :(得分:0)
好吧,由于客户管理员正在通过某些浏览器SQL工具执行相同的过程,我设法弄明白了。在那里,我看到第11列的类型为Date
。 ODBC为该列返回了类型INT
。所以我不得不打电话给另一个设置ODBC的管理员,他将列类型更改为varchar
,所以现在它终于有效了。
我想我现在可以假设如果一个错误的列类型使得所有后续列都无法读取,DataReader将如何工作。
我不想接受我自己的答案,所以如果有人愿意给我一些关于ODBC如何工作以及DataReader
如何工作的链接,而不仅仅是如何使用它,也许可以引用一些解释这种行为的文字......