它有点奇怪,但我面临的问题实际上不是预期的行为。
考虑以下功能:
public static System.Data.DataSet getDataSet(string cmdStr, System.Collections.Hashtable parameters)
{
OdbcDataAdapter adap = new OdbcDataAdapter(cmdStr, getConnection());
foreach (object obj in parameters.Keys)
{
adap.SelectCommand.Parameters.AddWithValue(obj.ToString(), parameters[obj]);
}
System.Data.DataSet ds = new System.Data.DataSet();
adap.Fill(ds);
return ds;
}
我使用此函数执行任何具有一些参数的sql命令。 例如,考虑代码:
string qryStr = "exec bitss_savePaymentData " +
"@cdate=@cdate," +
"@payid=@payid," +
"@AMOUNT=@AMOUNT";
System.Collections.Hashtable ht = new System.Collections.Hashtable();
ht.Add("@cdate", DateTime.Now.Date);
ht.Add("@AMOUNT", 100);
ht.Add("@payid", 101);
DataSet ds=getDataSet(qryStr, ht);
问题: 上面的代码抛出异常“必须声明标量变量@cdate”。如果我使用SQLDataAdapter而不是OdbcDataAdapter,则相同的代码可以工作。
任何想法我在这里缺少什么?
我甚至试过这个:
string ConnectionString = "dsn=mysql;uid=sa;DATABASE=userdb;";
string qryStr = "insert into info(code) values(@code);";
OdbcConnection con = new OdbcConnection(ConnectionString);
OdbcCommand cmd = new OdbcCommand(qryStr,con );
cmd.Parameters.Add("@code", System.Data.Odbc.OdbcType.Int).Value = "999";
cmd.Connection.Open();
OdbcDataReader odbcdtr = cmd.ExecuteReader();//exception "must declare the scalar variable @code"
con.Close;
我无法弄清楚上面代码中出现异常的原因。
答案 0 :(得分:1)
我终于找到了this链接中给出的解决方案。
Odbc接口只识别@named变量的使用?这是按职位采取的。你可以使用?Param1,?Param 2来提高可读性,但是所有的位置都是使用的。