2013-04-26 51 views
0

在我的C#MVC4應用程序,我有以下代碼:上線SQL參數格式問題

string[] parameters = new string[items.Count]; 
      SqlCommand SecondQuery = new SqlCommand(); 
      for (int i = 0; i < items.Count; i++) 
      { 
       parameters[i] = string.Format(items[i].Id); 
       SecondQuery.Parameters.AddWithValue(parameters[i], items[i]); 
      } 
      SecondQuery.CommandText = string.Format("SELECT * from S_analysis WHERE heat_no IN ({0})", string.Join(", ", parameters)); 
      SecondQuery.Connection = new SqlConnection(strSQLconnection); 
      using (SqlConnection conn = new SqlConnection(strSQLconnection)) 
      { 
       SecondQuery.CommandTimeout = 50000; 
       conn.Open(); 
       SecondQuery.Connection = new SqlConnection(strSQLconnection); 
       SecondQuery.Connection.Open(); 

       using (var reader7 = SecondQuery.ExecuteReader()) 
       { 
        int fieldCount = reader7.FieldCount; 

        while (reader7.Read()) 
        { 
         for (int i = 0; i < fieldCount; i++) 
         { 
          finalresults.Add(reader7[i].ToString()); 
         } 
        } 
       } 
      } 

我的應用程序崩潰:using (var reader7 = SecondQuery.ExecuteReader())與此錯誤:No mapping exists from object type <>f__AnonymousType42[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]] to a known managed provider native type.

林假設這是因爲當我查看我的SecondQuery.CommandText我的查詢如下所示:SecondQuery.CommandText = "SELECT * from S_analysis WHERE heat_no IN (B5P5649, B5P5647, B5P5656, A5P0761, A5P0762)"我相信代碼的IN部分中的每個參數應該在每一邊都有單引號符號。我如何修改我的代碼來添加這個或是這是什麼導致我的錯誤?

+2

3 Sqlconnections和一個執行?有些事情不對...... – 2013-04-26 00:20:06

+0

你真的應該考慮爲你的變量更好地命名約定。例如,'SecondQuery'看起來會更好,因爲'secondQuery'。更不用說(儘管我提到它),「finalResults」而不是「finalresults」。 – Brian 2013-04-26 01:11:41

回答

3

你說得對,字符串值需要引用SQL Server。

string.Join(", ", parameters) 

有很多選擇,但是這會工作如果這是唯一的問題

"'"+string.Join(",", parameters).Replace(",", "','")+"'" 

然而,在代碼中的bug也越來越廣泛。您試圖參數化每個項目 - 這是行不通的,因爲在CommandText中無處指定佔位符。你所擁有的只是靜態的IN列表。你也有更多的SqlConnection實例。

 string[] parameters = new string[items.Count]; 
     SqlCommand SecondQuery = new SqlCommand(); 
     for (int i = 0; i < items.Count; i++) 
     { 
      parameters[i] = "'" + string.Format(items[i].Id) + "'"; 
      //SecondQuery.Parameters.AddWithValue(parameters[i], items[i]); 
     } 
     SecondQuery.CommandText = string.Format("SELECT * from S_analysis WHERE heat_no IN ({0})", string.Join(",", parameters)); 
     using (SqlConnection conn = new SqlConnection(strSQLconnection)) 
     { 
      SecondQuery.CommandTimeout = 50000; 
      conn.Open(); 
      SecondQuery.Connection = conn; 

      using (var reader7 = SecondQuery.ExecuteReader()) 
      { 
       int fieldCount = reader7.FieldCount; 

       while (reader7.Read()) 
       { 
        for (int i = 0; i < fieldCount; i++) 
        { 
         finalresults.Add(reader7[i].ToString()); 
        } 
       } 
      } 
     } 
+0

感謝您的幫助。林混淆了你的代碼刪除,我把項目中的值放入字符串數組。項目中的每個項目都有兩個值(一個ID和一個日期)。我只想使用ID作爲參數。 – HendPro12 2013-04-26 00:37:54

+1

我的錯誤。我認爲這是一個字符串[] - > string []的直接副本。我也選擇在循環中引用字符串,而不是在我的修訂中的.join之後.replace。 – RichardTheKiwi 2013-04-26 00:51:24

+0

希望我可以多次提高您的答案。這些變化是無價的。 – HendPro12 2013-04-26 02:36:15