Вставка данных в таблицу SQL показывает ошибку - PullRequest
0 голосов
/ 02 мая 2019

Я пытаюсь сохранить данные массива в таблицу SQL, но каждый раз выдает ошибку. Я действительно не знаю, как решить эту проблему и решить проблему

Я уже пытался вставить значения по-разному и отдельно, но он все еще не работает. Я извлекаю данные из MS Word, а затем помещаю их в массив перед передачей в таблицу SQL

SqlConnection sc = new SqlConnection();
SqlCommand sm = new SqlCommand();
sc.ConnectionString = "server = ASIR\\SQLEXPRESS; database = elawdb; uid = Asir/Dip; Integrated Security=True";
sc.Open();
string query = "INSERT INTO Reference_form (DATAFILENAME, ACTFILENAME, ACTTITLE,FORMNUMBER, FORMTITLE, SECTIONREFERENCE, BOOLEANTEXT, COUNTRY)";
query += " VALUES (" + db[0] + "," + db[1] + "," + db[2] + "," + db[3] + "," + db[4] + "," + db[5] + "," + db[6] + "," + db[7] +" )";

SqlCommand myCommand = new SqlCommand(query, sc);
//}
myCommand.ExecuteNonQuery();

//       myinfo.Text = "connection to db is made";
sc.Close();
doc.Close();
word.Quit();

Я получаю ошибку:

Необработанное исключение типа 'System.Data.SqlClient.SqlException' произошел в System.Data.dll Неверный синтаксис рядом с ','. «Out» не является опознанная опция SET.

Ответы [ 2 ]

0 голосов
/ 02 мая 2019

Непосредственной проблемой является то, что вы объединяете строки в свой код SQL, не заключая их в апострофы. Когда запрос выполняется, Sql Server находит что-то, похожее на код SQL, а не на строки, которые нужно вставить.

Но это плохая практика для создания запроса путем объединения значений полей, как вы делаете в настоящее время. Это может открыть возможность инъекции Sql , что, в свою очередь, может привести к утечке или потере данных. Теперь - это время для вас, чтобы научиться использовать параметры вместо объединения данных в код Sql.

Вот (непроверенная) версия SQL-части вашего кода:

using (SqlConnection sc = new SqlConnection())
using (SqlCommand sm = new SqlCommand())
{
    sc.ConnectionString = "server = ASIR\\SQLEXPRESS; database = elawdb; uid = Asir/Dip; Integrated Security=True";
    sc.Open();
    sm.CommandText = @"
        INSERT INTO Reference_form (DATAFILENAME, ACTFILENAME, ACTTITLE, FORMNUMBER, FORMTITLE, SECTIONREFERENCE, BOOLEANTEXT, COUNTRY)
        VALUES (@DATAFILENAME, @ACTFILENAME, @ACTTITLE, @FORMNUMBER, @FORMTITLE, @SECTIONREFERENCE, @BOOLEANTEXT, @COUNTRY)
    ";
    sm.Parameters.Add(new SqlParameter("@DATAFILENAME", System.Data.SqlDbType.VarChar)).Value = db[0];
    sm.Parameters.Add(new SqlParameter("@ACTFILENAME", System.Data.SqlDbType.VarChar)).Value = db[1];
    sm.Parameters.Add(new SqlParameter("@ACTTITLE", System.Data.SqlDbType.VarChar)).Value = db[2];
    sm.Parameters.Add(new SqlParameter("@FORMNUMBER", System.Data.SqlDbType.VarChar)).Value = db[3];
    sm.Parameters.Add(new SqlParameter("@FORMTITLE", System.Data.SqlDbType.VarChar)).Value = db[4];
    sm.Parameters.Add(new SqlParameter("@SECTIONREFERENCE", System.Data.SqlDbType.VarChar)).Value = db[5];
    sm.Parameters.Add(new SqlParameter("@BOOLEANTEXT", System.Data.SqlDbType.Text)).Value = db[6];
    sm.Parameters.Add(new SqlParameter("@COUNTRY", System.Data.SqlDbType.VarChar)).Value = db[7];
    sm.Connection = sc;
    sm.ExecuteNonQuery();
}
0 голосов
/ 02 мая 2019

Начиная с C # 6, вы можете использовать интерполяцию строк, что делает вашу команду sql более читабельной.

string query = $"INSERT INTO Reference_form (DATAFILENAME, ACTFILENAME, ACTTITLE,FORMNUMBER, FORMTITLE, SECTIONREFERENCE, BOOLEANTEXT, COUNTRY) VALUES ('{db[0]}', '{db[1]}', .......)";

Если вы хотите получить более подробный ответ, вы должны показать нам свою таблицу и команду вставки sql с примерами значений

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...