2011-05-03 105 views
3
private void AddValue(string strValue) 

{ 

     //get the maximum id for Lists first 

     int MaxID = DataOperations.ReturnMaxIDInATable("Lists", connString); 
     int iSqlStatus = 0; 
     string query = "INSERT INTO Lists(ID, ListName, ListValue) 
     VALUES(@MaxID, @ListName, @ListValue)"; 

     MaxID++; 

     OleDbConnection dbConn = new OleDbConnection(connString); 
     OleDbCommand dbComm = new OleDbCommand(); 

     dbComm.Parameters.Clear(); 
     try 
     { 
       dbComm.CommandText = query; 
       dbComm.CommandType = CommandType.Text; 

       OleDbParameter IDParam = new OleDbParameter(); 
       IDParam.ParameterName = "@MaxID"; 
       IDParam.OleDbType = OleDbType.BigInt; 
       IDParam.Value = MaxID; 
       dbComm.Parameters.Add(IDParam); 

       dbComm.Parameters.AddWithValue("@ListName", ListName); 
       dbComm.Parameters.AddWithValue("@ListValue", strValue); 
       dbComm.Connection = dbConn; 
       DataAccess.HandleConnection(dbConn); 

       iSqlStatus = Convert.ToInt16(dbComm.ExecuteNonQuery()); 

       //Now check the status 
       if (iSqlStatus != 0) 
       { 
        //DO your failed messaging here 
        //return false; 
       } 
       else 
       { 
        //Do your success work here 
        //dbComm. 
        //return true; 
       } 
     } 
     catch (Exception ex) 
     { 
       MessageBox.Show(ex.Message, "Error inserting value in " 
              + ListName + "," 
              + strValue); 
       //return false; 
     } 
     finally 
     { 
       DataAccess.HandleConnection(dbConn); 
     } 

} 
+0

http://stackoverflow.com/questions/389591/dotnet-oledbparameters-name-obsession – 2011-05-03 13:49:01

回答

5

我相信你需要通過的OleDbCommand執行SQL時使用問號的參數(而的SqlCommand用途@)。示例:

INSERT INTO Lists (ID, ListName, ListValue) VALUES (?, ?, ?) 

您只需要按照它們在SQL中出現的順序添加參數。

+1

對於OleDb來說,它是計數的順序,而不是名稱 – 2011-05-03 13:41:48

+1

但不僅是順序,而是*問號*代表OleDb的「參數」。 – 2011-05-03 13:44:16

+0

我一直在使用@作爲代碼的其他部分的參數名稱,它的工作原理如此改變?應該是沒有意義的。但我會嘗試其他方式。此外,我認爲不會影響的順序,但我也會嘗試。 – 2011-05-05 20:30:17

-2

下面的片段應該是:

IDParam.ParameterName = "MaxID"; 
IDParam.OleDbType = OleDbType.BigInt; 
IDParam.Value = MaxID; 
dbComm.Parameters.Add(IDParam); 

dbComm.Parameters.AddWithValue("ListName", ListName); 
dbComm.Parameters.AddWithValue("ListValue", strValue); 
+1

它不能解決OleDbCommand的問題。即使它對SqlCommand沒有任何影響。 – 2011-05-03 14:06:16

+0

我以前試過BigInt,但沒有工作。但是還沒有嘗試不使用參數名稱的前綴。我也會嘗試這一個。 – 2011-05-05 20:31:22

+0

參數上的前綴也不起作用。記住更多的解決方案? – 2011-05-16 12:42:50

-2

這似乎這樣的伎倆..

string query = string.Format("INSERT INTO Lists(ID, ListName, ListValue) 
     VALUES({0}, '{1}', '{2}')", MaxID, ListName, strValue); 

雖然我有所保留像什麼,如果我需要添加一個日期值?

+1

不認爲注射是解決這個問題的正確方法 – 2013-06-27 10:02:01

0

如果您在查詢開始時的條款「聲明」,將工作:

string query = "DECLARE @MaxID as bigint, "+ 
         " @ListName as Varchar(100), "+ 
         " @ListValue As Varchar(100) " + 
     " INSERT INTO Lists(ID, ListName, ListValue) " + 
      " VALUES(@MaxID, @ListName, @ListValue)" 

此外,正確的解決方案是改變你的驅動程序SQLCLIENT和OracleClient的。 OleDb不推薦與SQL 2005及更高版本一起使用。