【錯誤一】 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://www.cnblogs.com/shelley/archive/2010/05/25/1743438.html