最近寫程序用到OleDbCommand的Parameter寫數據庫,遇到很多問題:
1、OLE DB .NET Framework 數據提供程序和 ODBC .NET Framework 數據提供程序不支持用於將參數傳遞到 SQL 語句或存儲過程的命名參數。在此情況下,必須使用問號 (?) 占位符,如以下示例所示。SELECT * FROM Customers WHERE CustomerID = ?
2、將參數用於OleDbCommand 或 OdbcCommand 時,向 Parameters 集合中添加參數的順序必須與存儲過程中所定義的參數順序相匹配。OLE DB .NET Framework 數據提供程序和 ODBC .NET Framework 數據提供程序將存儲過程中的參數視為占位符,並且將按順序使用這些參數值。另外,返回值參數必須是添加到 Parameters 集合中的第一批參數。
因此,向 Parameters 集合添加 Parameter 對象的順序必須直接對應於該參數的問號占位符的位置
例如:
string sql = "insert into T_Fundratesum(fundcode,yhcode,sumdate,period,m12brate,m12rrate,createtimestamp) values (?,?,?,?,?,?,?)";
OleDbCommand comm = new OleDbCommand(sql, conn);
comm.Parameters.Add(new OleDbParameter("@fundcode", OleDbType.VarChar));
comm.Parameters[0].Value = dt.Rows[i]["yhcode"].ToString();
comm.Parameters.Add(new OleDbParameter("@yhcode", OleDbType.VarChar));
comm.Parameters[1].Value = dt.Rows[i]["fundcode"].ToString();
comm.Parameters.Add(new OleDbParameter("@sumdate", OleDbType.Date));
comm.Parameters[2].Value = DateTime.Now.ToString();
comm.Parameters.Add(new OleDbParameter("@PERIOD", OleDbType.Double));
comm.Parameters[3].Value = dt.Rows[i]["PERIOD"];
comm.Parameters.Add(new OleDbParameter("@M12BRATE", OleDbType.Double));
comm.Parameters[4].Value = dt.Rows[i]["M12BRATE"];
comm.Parameters.Add(new OleDbParameter("@M12RRATE", OleDbType.Double));
comm.Parameters[5].Value = dt.Rows[i]["M12RRATE"];
comm.Parameters.Add(new OleDbParameter("@createtimestamp", OleDbType.VarChar));
comm.Parameters[6].Value = DateTime.Now.ToString();
當然還有最笨的辦法就是,定義一個字符串,然後將其裡面的參數用string.replace替換。
我從網上查到一個網友的回復如下:我想應該是這樣的
1.SqlCommand should be '@' character
2.OleDbCommand or OdbcCommand should be '?' character
3.OracleCommand should be ':' character
唉,這些Command的不便利性使得用戶在使用時常常摸不到頭腦,不同的command有不同的參數格式設置,以後應該多多注意。