2012-03-06 123 views
0

我很奇怪,爲什麼我上SqlDataReader reader2 = theCommandInsert.ExecuteReader();SQL服務器插入查詢

這一個例外是我使用的代碼:

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'。

我沒有檢查數據庫中,沒有重複的標識或東西..

你能幫助我嗎?

乾杯。

+10

**警告**您的代碼容易受到sql注入攻擊! – 2012-03-06 17:45:41

+2

解決方法是在SQL命令中使用參數,如我在下面的答案中所述。 – ashes999 2012-03-06 17:48:06

+1

爲什麼使用btw的'ExecuteReader()'而不是'ExecuteNonQuery'? – 2012-03-06 21:11:08

回答

4

爲什麼使用動態查詢字符串?這是一個字符串,將其定義爲這樣。

您還在設置自己的設置,允許某人在您的站點上執行SQL注入攻擊。

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

這不是重複ID的問題;您嘗試插入到Groups_Folders中的行將被賦予一個GroupId,該ID不存在於數據庫中。它看起來像

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

實際上並沒有正確生成您想要的GroupId。嘗試查看param的值並檢查以確保它實際上是您想要的值。

+0

添加到使用selectedvalue ...它被綁定。 – Kiwimoisi 2012-03-06 17:52:50

5

您面臨SQL注入攻擊的風險。您需要使用參數從文本框中傳遞值 - 而不僅僅是連接字符串。

查詢字符串是動態類型的原因嗎?

問題是與外鍵衝突,而不是主鍵或唯一性違規。這似乎是你的外鍵FK_GROUPS_FOLDERS_Groups不允許重複你插入的兩個字段之一。

+0

指出SQL注入攻擊是有價值的,但解決方案其實是錯誤的。該錯誤是由試圖插入到GROUPS_FOLDERS表中的組表中的_missing_值造成的,而不是任何字段上的副本。 – 2012-03-06 19:07:21

+1

@GuthMD如果你是對的,那麼你會從我+1得到它:)只要你的答案是被接受的答案,我們是好的。 – ashes999 2012-03-06 20:18:34

+0

他可能仍然會在修復引用錯誤後在GROUPS_FOLDERS上得到重複的輸入錯誤,但是由於「衝突發生在」語句中提到了「組表」,所以這裏的問題是他試圖插入的ID缺失。您的初始陳述是正確的,問題是一個外鍵違規。 – 2012-03-06 21:45:48

4

這不是說重複的id,而是一個外鍵約束。建議您查看GROUPS_FOLDERS表,並且您可能會在Group_Id上看到指向您的組表的FK約束。檢查您嘗試插入的值param是Group中的現有值.Id

1
  1. 您正嘗試在父表中不存在的數據庫中插入值。這是由於在forign鍵約束來對錶 2.

請使用參數化查詢,以避免SQL注入&使用 參數綁定你的價值觀(它會使你的代碼更易讀& 安全)