Выполнение инструкции SQL в C #? - PullRequest
1 голос
/ 23 апреля 2009

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

Спасибо, Эш.

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);

    }
}

Ответы [ 5 ]

18 голосов
/ 24 апреля 2009

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

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

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

Наконец, вы на самом деле не используете массив в своем коде. Все, что вас действительно волнует, - это возможность перебирать набор слов, и поэтому вы хотите принять 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 голосов
/ 24 апреля 2009

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

0 голосов
/ 26 августа 2009

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

string query = "INSERT INTO Table_PersonInfo
(PersonID,Surname
,[Family Name]
,AddsOnName
,Street,Number
,PostalCode
,[City of Birth]
,[Year of Birth]
,[Phone Number])
 VALUES
 ('"+@personID+"'
, '"+ @surname + "' 
, '"+@familyname+"'
, '"+@nameExtension+"'
, '"+@street+"'
, '"+@houseNumber+"'
, '"+ @postalCode+"'
, '"+@yearofbirth+"'
, '"+@placeofbirth+"'
, '"+@phoneNumber+"')";
0 голосов
/ 24 апреля 2009

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

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

Поля символов и даты требуют, чтобы значения были заключены в одинарные кавычки

0 голосов
/ 24 апреля 2009

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

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