2013-03-20 3 views
0

У меня есть БД доступа с таблицей (DV1), которая имеет столбцы [ID TIME CODE REASON]. Я просто пытаюсь обновить таблицу. Я продолжаю получать ошибку sysax INSERT INTO. Все, что я вижу, выглядит прекрасно. Я все пробовал. Я открываю базу данных, затем получаю сообщение об ошибке. Есть предположения?Добавление в Access DB с INSERT INTO?

private void WRTODB_Click(object sender, EventArgs e) 
    { 
     OleDbConnection machStopDB = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source="[email protected]"C:\Users\sgarner\Google Drive\Visual Studio 2012\Timer test\WRITE TO DB\WRITE TO DB\Machine_Stop.accdb"); 
     machStopDB.Open(); 
     string str = "INSERT INTO DV1(TIME,CODE,REASON)" + 
      "VALUES(('" + DateTime.Now + "'),('" + textBox1.Text + "'),('" + textBox2.Text + "'))"; 
     OleDbCommand insertCmd = new OleDbCommand(str, machStopDB); 
     insertCmd.ExecuteNonQuery(); 
     machStopDB.Close(); 
    } 

Это всего лишь тестовая программа, с которой я работаю.

+3

Попробуйте использовать параметры http://msdn.microsoft.com/en-GB/library/system.data.oledb.oledbcommand. parameters.aspx, чтобы сделать ваш код более читаемым – Yahya

+0

@Yahya и, возможно, что более важно, менее уязвим для SQL-инъекции – GolfWolf

+0

Возможно, я ошибаюсь, но почему у вас есть скобки вокруг каждого значения? Думаю, достаточно одной кавычки. – Yahya

ответ

1

Следующий код включает в себя звуковые идеи, предлагаемые выше комментарии:

private void WRTODB_Click(object sender, EventArgs e)   
{ 
    try 
    { 
     using (SqlConnection dbConnection = new SqlConnection()) 
     { 
      string Source = @"C:\Users\sgarner\Google Drive\Visual Studio 2012\Timer test\WRITE TO DB\WRITE TO DB\Machine_Stop.accdb"; 
      dbConnection.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + Source; 
      dbConnection.Open(); 
      using (SqlCommand command = new SqlCommand("INSERT INTO DV1([TIME],CODE,REASON) VALUES ([pTime],[pCode],[pReason])", dbConnection)) 
      { 
       command.Parameters.AddWithValue("pTime", DateTime.Now); 
       command.Parameters.AddWithValue("pCode", textBox1.Text); 
       command.Parameters.AddWithValue("pReason", textBox2.Text); 
       command.ExecuteNonQuery(); 
      } 
      dbConnection.Close(); 
     } 
    } 
    catch (Exception ex) 
    { 
     throw new Exception(ex.Message); 
    } 
} 
+0

Время [зарезервированное слово] (http://support.microsoft.com/kb/321266), вам нужно будет его избежать. Зачем вставлять ptime, когда MS Access имеет сейчас()? – Fionnuala

+0

Спасибо @Remou - я упустил TIME - отредактировал сообщение. Я не понимаю, что вы подразумеваете под MS-Access, теперь()? Вы имеете в виду, что определение поля должно включать default, который указывает Now()? - Я бы согласился с этим. –

+0

+1 Да, но не только это, что действительно было бы хорошо, вы можете просто использовать теперь в строке sql 'VALUES (Now(), [pCode], «Это сэкономит немало боли. – Fionnuala

Смежные вопросы