2009-04-23 7 views
1

Эй, ребята, я хочу выполнить свой SQL-оператор, но у меня есть проблема с synatx, может кто-нибудь помочь мне понять, что я делаю неправильно?Выполнение инструкции SQL в C#?

Спасибо, Ash.

public void AddToDatabase(string[] WordArray, int Good, int Bad, int Remove) 
{ 

    for (int WordCount = 0; WordCount < WordArray.Length; WordCount++) 
    { 
     string sSQL = "INSERT INTO WordDef (Word, Good, Bad, Remove) VALUES (" + WordArray[WordCount] + ", " + Good + ", " + Bad + ", " + Remove + ")"; 

     Debug.Print(sSQL); 

     //Private m_recordset As ADODB.Recordset 
     //Private m_connection As ADODB.Connection 
     ADODB.Recordset RS; 
     ADODB.Connection CN ; 


     CN = new ADODB.Connection(); 
     RS = new ADODB.Recordset(); 

     CN.CursorLocation = ADODB.CursorLocationEnum.adUseClient; 

     CN.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=doom_calc_dict.mdb;jet OLEDB:database"; 
     CN.Open(CN.ConnectionString,"","",0); 

     object dummy = Type.Missing; 

     CN.Execute(sSQL,out dummy,0); 

     RS.Close(); 
     CN.Close(); 

     //string sSQL = "SELECT Word FROM WordDef WHERE Word='" + WordArray[WordCount] + "'"; 
     DatabaseTools.LoadDataFromDatabase(sSQL); 
     //DatabaseTools.LoadDataFromDatabase(sSQL); 

    } 
} 
+0

Что такое ошибка? – Blorgbeard

+0

Каков результат вашей Debug.Print (sSql)? Где ваш код брокер, если вы отлаживаете, в CN.Execute? или при открытии соединения sql? – Melursus

+0

Просто примечание, что я обновил свой ответ для работы с VS 2005/.Net2.0. Он полагался на функцию VS2008. –

ответ

18

Самое важное, что вам нужно исправить, - это использовать параметры запроса, а не динамически строить строку. Это улучшит производительность, обслуживание и безопасность.

Кроме того, вы хотите использовать новые сильно типизированные объекты ADO.Net. Обязательно добавьте директивы для System.Data.OleDb.

Отметьте using заявления этого кода. Они будут делать sure. Ваше соединение закрывается, когда вы его берете. Это важно, потому что соединения с базой данных - это ограниченный и неуправляемый ресурс.

Наконец, вы действительно не используете массив в своем коде. Все, что вам действительно волнует, - это возможность перебирать набор слов, и поэтому вы хотите принять IEnumerable<string> вместо массива. Не беспокойтесь: эта функция примет массив в качестве аргумента, если это то, что вам нужно передать.

public void AddToDatabase(IEnumerable<string> Words, int Good, int Bad, int Remove) 
{ 
    string sql = "INSERT INTO WordDef (Word, Good, Bad, Remove) VALUES (@Word, @Good, @Bad, @Remove)"; 

    using (OleDbConnection cn = new OleDbConnection("connection string here")) 
    using (OleDbCommand cmd = new OleDbCommand(sql, cn)) 
    { 
     cmd.Parameters.Add("@Word", OleDbType.VarChar); 
     cmd.Parameters.Add("@Good", OleDbType.Integer).Value = Good; 
     cmd.Parameters.Add("@Bad", OleDbType.Integer).Value = Bad; 
     cmd.Parameters.Add("@Remove", OleDbType.Integer.Value = Remove; 

     cn.Open(); 

     foreach (string word in Words) 
     { 
      cmd.Parameters[0].Value = word; 
      cmd.ExecuteNonQuery(); 
     } 
    } 
} 

И еще одно: при использовании параметров запроса в OleDb, важно убедиться, что вы добавляете их в порядке.

Обновление: Исправлено для работы с VS 2005/.Net 2.0 (опирался на функции VS 2008).

+3

+1 для здравого смысла (параметризованный запрос) –

+0

Это лучший подход, поскольку подготовленные операторы всегда безопаснее, чем динамическое генерирование запросов. Я буду динамически генерировать их, если у пользователя нет абсолютно никакой информации, это единственный раз. –

+0

Это гораздо лучший подход, но параметры метода Pascal-case заставили меня оглянуться на свойства класса, на которые вы ссылались на мгновение. –

0

Попробуйте это (и вы должны попытаться запустить SQL из-за вашего приложения):

string sSQL = "INSERT INTO WordDef (Word, Good, Bad, Remove) VALUES ('" + WordArray[WordCount] + "', " + Good + ", " + Bad + ", " + Remove + ");"; 
+1

Не просто объединяйте ваши SQL-предложения вместе - это BAD BAD BAD и открывает приложение для атак SQL-инъекций. Вместо этого используйте параметризованные запросы! Простой, быстрый, безопасный. –

+2

Я бы не писал свое приложение таким образом, и я проголосовал за ответ, который был в конечном итоге принят. Не меняет техническую корректность запроса, о чем и шла речь. – Elie

0

Вам нужно добавить одиночные кавычки вокруг первого аргумента в заявлении SQL.

string sSQL = "INSERT INTO WordDef (Word, Good, Bad, Remove) VALUES ('" + WordArray[WordCount] + "', " + Good + ", " + Bad + ", " + Remove + ")"; 

символов и дата поля требуют значения должны быть окружены «одинарные кавычки»

+0

Не просто объединяйте свои SQL-предложения вместе - это BAD BAD BAD и открывает приложение для атак SQL-инъекций. Вместо этого используйте параметризованные запросы! Простой, быстрый, безопасный. –

+0

Да, но вопрос был не в том, как я могу предотвратить атаку инъекции sql. Вот почему я получаю эту ошибку. – Jeremy

3

Он будет появляться на первой, что я не быть полезным. Но, по правде говоря, я пытаюсь помочь вам, поэтому, пожалуйста, возьмите это. Вам необходимо прочитать this и this STAT! Как только вы это сделали, вот некоторые хорошие, чистые ADO.NET examples.

Удачи вам! :)

0

Нет вам это нужно так:

string query = "INSERT INTO Table_PersonInfo 
(PersonID,Surname 
,[Family Name] 
,AddsOnName 
,Street,Number 
,PostalCode 
,[City of Birth] 
,[Year of Birth] 
,[Phone Number]) 
VALUES 
('"[email protected]+"' 
, '"+ @surname + "' 
, '"[email protected]+"' 
, '"[email protected]+"' 
, '"[email protected]+"' 
, '"[email protected]+"' 
, '"+ @postalCode+"' 
, '"[email protected]+"' 
, '"[email protected]+"' 
, '"[email protected]+"')"; 

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

  • Нет связанных вопросов^_^