Ошибка при выполнении OleDbCommand .. "Необходимо объявить скалярную переменную" @MaxID "." - PullRequest
3 голосов
/ 03 мая 2011
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);
      }

}

Ответы [ 4 ]

5 голосов
/ 03 мая 2011

Я считаю, что вам нужно использовать вопросительные знаки для параметров при выполнении SQL через OleDbCommand (в то время как SqlCommand использует @). Пример:

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

Вам нужно только добавить параметры в том порядке, в котором они появляются в SQL.

0 голосов
/ 05 июля 2016

Если вы включите пункт «DECLARE» в начале запроса, будет работать:

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 и выше.

0 голосов
/ 16 мая 2011

Кажется, это сработало ..

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

Хотя у меня есть оговорки по этому поводу, например, что если мне нужно добавить значение даты?

0 голосов
/ 03 мая 2011

Следующий фрагмент должен читать:

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

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