2012-03-06 2 views
0

Я задаюсь вопросом, почему я получаю исключение на SqlDataReader reader2 = theCommandInsert.ExecuteReader();SQL Server Вставить запрос

на это код, я использую:

var conString = ConfigurationManager.ConnectionStrings["LocalSqlServer"]; 
string strConnString = conString.ConnectionString; 

SqlConnection dbConnection = new SqlConnection(strConnString); 

dynamic queryString = ("INSERT INTO FOLDERS (Name) VALUES ('" + txtBoxFolderLabel.Text + "') "); 

int param = CheckBoxList2.SelectedIndex; 
param = param + 1; 

dynamic queryStringInsert = ("INSERT INTO GROUPS_FOLDERS (Folder_Id, Group_Id) VALUES(IDENT_CURRENT('Folders') , " + param + ")"); 
SqlCommand theCommand = new SqlCommand(queryString, dbConnection); 
SqlCommand theCommandInsert = new SqlCommand(queryStringInsert, dbConnection); 

//Connection opening and executing 
if (string.IsNullOrEmpty(txtBoxFolderLabel.Text) | CheckBoxList2.SelectedIndex.ToString() == null) 
{ 
    Response.Write("Empty fields !"); 
} 
else if (Functions.IsNumeric(txtBoxFolderLabel.Text)) 
{ 
    Response.Write("No numerics !"); 
} 
else 
{ 
    dbConnection.Open(); 
    SqlDataReader reader = theCommand.ExecuteReader(); 

    string folderName = txtBoxFolderLabel.Text; 

    // Create folder 
    System.IO.Directory.CreateDirectory("C://inetpub//wwwroot//Files//" + folderName); 

    dbConnection.Close(); 

    dbConnection.Open(); 
    SqlDataReader reader2 = theCommandInsert.ExecuteReader(); 
    dbConnection.Close(); 

Это исключение, которое я получаю:

Заявление INSERT противоречило ограничениям FOREIGN KEY «FK_GROUPS_FOLDERS_Groups». Конфликт произошел в базе данных "9B15719DF48C3E2301D7F965674A6F93_VISUAL STUDIO 2010 \ Projects \ CLIENTPORTAL \ APPLICATIONUI \ ВЕБСАЙТОВ \ CLIENTPORTAL \ App_Data \ DATAUI.MDF", стол "dbo.Groups", столбец 'Id'.

Я проверить в базе данных, нет нет Id дублированный или что-то ..

Не могли бы вы мне помочь, пожалуйста?

Cheers.

+10

** ВНИМАНИЕ ** ваш код уязвим для SQL-инъекций! –

+2

Исправление состоит в том, чтобы использовать параметры с вашей командой SQL, как указано в моем ответе ниже. – ashes999

+1

Почему использование btw 'ExecuteReader()' вместо 'ExecuteNonQuery'? –

ответ

4

Почему вы используете динамический для строки запроса? Это строка, определяющая ее как таковую.

Вы также настраиваете себя, чтобы позволить кому-либо выполнить атаку SQL Injection на вашем сайте.

string queryString = ("INSERT INTO FOLDERS (Name) VALUES ('" + txtBoxFolderLabel.Text + "') "); 

Неплохая идея, вы должны использовать параметры Sql.

string queryString = ("INSERT INTO FOLDERS (Name) VALUES (@folder) "); 

Вы можете определить параметр после создания команды

theCommand.Parameters.AddWithValue("@folder", txtBoxFolderLabel.Text); 

Что касается конкретной ошибки, похоже, у вас есть внешний ключ, определенный на этой таблице, и вы не отвечают требованиям норм внешний ключ

3

Это не проблема с дублирующимся идентификатором; строке, которую вы пытаетесь вставить в Group_Folders, предоставляется GroupId, который не существует в базе данных. Похоже, что

int param = CheckBoxList2.SelectedIndex; 
param = param + 1; 

на самом деле не правильно генерирует желаемый GroupId. Попробуйте оценить значение param и убедитесь, что это действительно то, что вы хотите.

+0

Добавить к использованию selectedvalue ... Он был привязан. – Kiwimoisi

5

У вас есть риск атаки SQL-инъекций. Вам нужно использовать параметры для передачи значений из текстового поля, а не только конкатенации строк.

Есть ли причина, по которой ваши строки запросов являются динамическими типами?

Проблема связана с нарушением внешнего ключа, а не с первичным ключом или нарушением уникальности. Кажется, что ваш внешний ключ FK_GROUPS_FOLDERS_Groups не позволяет дублировать одно из двух полей, которые вы вставляете.

+0

Указание атаки на SQL-инъекцию является ценным, но решение на самом деле ошибочно. Ошибка возникает из-за значения _missing_ из таблицы Groups, которая пытается вставить в таблицу GROUPS_FOLDERS, а не дубликат в любом из полей. –

+1

@GuthMD, если вы правы, тогда вы получите +1 от меня за это :), пока ваш ответ является принятым ответом, мы хорошие. – ashes999

+0

По-прежнему может быть, что он получит дубликаты ошибок в GROUPS_FOLDERS после исправления эталонной ошибки, но так как в аргументе «конфликт произошел в» упоминается таблица «Группы», здесь здесь отсутствует идентификатор от того, что он пытается вставить. Ваш исходный оператор правильный, проблема _is_ нарушение внешнего ключа. –

4

Речь идет не о дублированном идентификаторе, а об ограничении внешнего ключа. Порекомендовал бы вам посмотреть таблицу GROUPS_FOLDERS, и вы, вероятно, увидите ограничение FK на Group_Id, указывающее на таблицу ваших групп. Убедитесь, что значение, которое вы пытаетесь вставить для param, является существующим значением в Groups.Id

1
  1. Вы пытаетесь вставить значение в базу данных, которая не существует в родительской таблице. Он приходит из-за внешним ключ ограничения на столе 2.

Пожалуйста, используйте параметризованный запрос, чтобы избежать инъекций SQL & Используйте параметров, чтобы связать свои ценности (это сделает ваш код более читаемым & безопасно)

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