【錯誤一】 SqlServer提示錯誤:OleDbException 必須聲明標量變量
今天用.net使用Oledb的方式操作SqlServer,卻總是莫名其妙的報“必須聲明標量變量…”,在代碼里面分別采用了下面的兩種方式,都無濟于事:
方法一:OleDbParameter[] p = new OleDbParameter[] {
new OleDbParameter("@aa",1),
new OleDbParameter("@bb","shelley"),
new OleDbParameter("@cc",DateTime.Now)
};
Objcmd.Parameters.AddRange(p);
方法二:OleDbParameter pp;
pp = new OleDbParameter("@aa",OleDbType.Integer);
pp.Value = 1;
Objcmd.Parameters.Add(pp);
pp = new OleDbParameter("@bb", OleDbType.LongVarChar);
pp.Value = "shelley";
Objcmd.Parameters.Add(pp);
pp = new OleDbParameter("@cc", OleDbType.Date);
pp.Value = DateTime.Now;
Objcmd.Parameters.Add(pp);無論怎么樣寫,都會提示“必須聲明標量變量@aa”,最終的原因是下面這句:OleDbCommand Objcmd = new OleDbCommand("insert into test (a,b,c)values(@aa,@bb,@cc)", Objconn);正確寫法:OleDbCommand Objcmd = new OleDbCommand("insert into test (a,b,c)values(?,?,?)", Objconn);這樣就正常通過了。 【錯誤二】Sybase提示錯誤:不支持此接口 (異常來自 HRESULT:0x80004002 (E_NOINTERFACE)).net用Oledb操作Sybase,因為在一個sql語句中可能會多次用到同一個參數,代碼如下:
OleDbCommand Objcmd = new OleDbCommand("update test set a=@aa where a=@aa", Objconn);
OleDbParameter[] p = new OleDbParameter[] {
new OleDbParameter("aa",1),
new OleDbParameter("aa",1)
};
Objcmd.Parameters.AddRange(p);
Objconn.Open();
Objcmd.ExecuteNonQuery();
Objconn.Close();上面的代碼就會提示“不支持此接口 (異常來自 HRESULT:0x80004002 (E_NOINTERFACE))”錯誤。問題原因在于參數中存在兩個相同名字,對于這種情況只需要寫一個參數就可以了,改動如下:
OleDbCommand Objcmd = new OleDbCommand("update test set a=@aa where a=@aa", Objconn);
OleDbParameter[] p = new OleDbParameter[] {
new OleDbParameter("aa",1)
};或
OleDbCommand Objcmd = new OleDbCommand("update test set a=@aa where a=@aa2", Objconn);
OleDbParameter[] p = new OleDbParameter[] {
new OleDbParameter("aa",1),
new OleDbParameter("aa2",1)
};【總結】
如果寫一個程序,需要支持SqlServer和Sybase的時候這個地方需要特別注意:
1.SqlServer需要用“?”作為參數占位符,這樣要求即使用到了同一個參數,也必須多次添加Parameter;
2.Sybase如果多次使用同一個參數,不能多次添加Parameter,否則會報錯;
http://m.survivalescaperooms.com/shelley/archive/2010/05/25/1743438.html
新聞熱點
疑難解答