使用OdbcDataReader读取SP的结果给出错误22018 -赋值错误
本文关键字:错误 出错 22018 赋值 结果 OdbcDataReader 读取 SP 使用 | 更新日期: 2023-09-27 18:12:31
我不明白。我以前没有使用过ODBC类,但认为它对于基本用途没有什么特别之处。它确实有效,除了这种情况
我需要通过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 + "|";
}
该列表列出了result中所有的列名,共有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
No StackTrace No InnerException。
我尝试跳过第11列,因为它从那里开始,但在前10列之后的每列都中断。我毫无头绪……如果它显示有20个字段,那么为什么…null值不是问题,因为它返回DBNull,它在其他地方工作(不执行SP,但做select查询)。
客户端从同一网络环境执行sp连接并发送给我picshot和csv数据。数据本身没有什么奇怪的。
以前有人做过这个吗?我应该用别的东西代替OdbcDataReader吗?
谢谢。
好的,我设法弄清楚了,这要感谢客户管理员,他正在通过一些浏览器SQL工具执行相同的过程。我看到第11列的类型是Date
。ODBC为该列返回类型INT
。所以我不得不打电话给另一个设置ODBC的管理员,他将列类型更改为varchar
,所以现在它终于工作了。
我想我现在可以假设如果一个错误的列类型导致所有后续列也无法读取,DataReader是如何工作的。
我不想接受我自己的答案,所以如果有人能好心地给我一些关于ODBC如何工作和DataReader
如何工作的链接,而不仅仅是如何使用它,也许可以引用一些文本来解释这种错误的行为…