2016-04-28 108 views
0

我正在處理髮送約9個字段到我的SQL數據庫的表單,並且出現此錯誤。 「標準表達式中的數據類型不匹配」。 我敢肯定這是與' x ''我把我的查詢,但仍然無法弄清楚是什麼問題。SQL查詢「標準表達式中的數據類型不匹配」。

(int,int,string,string,string,int,int,string,int,int)形式

string SqlStr = string.Format("insert into Orders(client_id,order_id,date_,card_typ,pay_mthd,ex_y,ex_m,cc_comp,cc_num,t_sale)values({0},{1},'{2}','{3}','{4}',{5},{6},'{7}',{8},{9})", s.ClientId,s.OrderId,s.Date,s.CardTyp,s.PayMethod,s.Ex_Y,s.Ex_M,s.CcComp,s.CcNum,s.TotalSale); 

感謝您的幫助。

+0

你可以分享你的數據庫結構,你把變量的類型? – BugFinder

+1

請勿使用字符串連接(或'String.Format')來構建您的sql查詢。而是使用參數化查詢來防止sql注入和其他(f.e.數據類型)問題。 –

+0

另外,爲什麼'date_'是'varchar'而不是'date'? –

回答

1

String.Format不會是構建查詢的好方法。我建議你使用,參數化查詢,可幫助您指定類型太同時也是它更有助於預防注射:下面是一個例子:

string query = "insert into Orders" + 
       "(client_id,order_id,date_,card_typ,...)" + 
       " values(@client_id,@order_id,@date_,@card_typ...)"; 
using (SqlCommand sqCmd = new SqlCommand(query, con)) 
{ 
    con.Open(); 
    sqCmd.Parameters.Add("@client_id", SqlDbType.Int).Value = s.ClientId; 
    sqCmd.Parameters.Add("@order_id", SqlDbType.VarChar).Value = s.OrderId; 
    sqCmd.Parameters.Add("@date_", SqlDbType.DateTime).Value = s.Date; 
    sqCmd.Parameters.Add("@card_typ", SqlDbType.Bit).Value = s.CardTyp; 
    // add rest of parameters 
    //Execute the commands here 
} 

注:我只包括在例如幾列,您可以將...替換爲其餘列。

+0

還有另一種選擇只是爲了玩弄**'**,因爲在其他情況下,它的工作,但我無法弄清楚是什麼問題。 ({0},{1},'{2}','{3}插入訂單(client_id,order_id,date_,card_typ,pay_mthd,t_sale) }','{4}',{5})「,s.ClientId,s.OrderId,s.Date,s.CardTyp,s.PayMethod,s.TotalSale);' –

+0

檢查日期輸入的格式,注入機會 –

+0

我知道,但現在不是問題,問題在於一個查詢有效,另一個不是。 –

0

請不要使用串聯串...

下面是一個例子:

 using (SqlConnection connection = new SqlConnection("...connection string ...")) 
     { 
      SqlCommand command = new SqlCommand("insert into Orders(client_id,order_id,date_,card_typ,pay_mthd,ex_y,ex_m,cc_comp,cc_num,t_sale)values(@client_id,@order_id,@date_,@card_typ,@pay_mthd,@ex_y,@ex_m,@cc_comp,@cc_num,@t_sale)", connection); 
      SqlParameter pclient_id = new SqlParameter("@client_id", System.Data.SqlDbType.Int); 
      pclient_id.Value = 12; 
      command.Parameters.Add(pclient_id); 
      SqlParameter pcard_typ = new SqlParameter("@card_typ", System.Data.SqlDbType.VarChar); 
      pcard_typ.Value = "some value"; 
      command.Parameters.Add(pcard_typ); 

      try 
      { 
       connection.Open(); 
       command.ExecuteNonQuery(); 
      } 
      catch (Exception ex) 
      { 
       Debug.WriteLine(ex.Message); 
      } 
      finally 
      { 
       connection.Close(); 
      } 

     } 
+0

我高中時就在我的高中。我不能做我想做的事,因爲我不會得到最大的點。我只需要幫助就可以知道我的查詢背後是什麼,給我這個錯誤。 N是什麼東西? –

相關問題