2013-03-25 119 views
2

我有一個用C#編寫的連接到SQL數據庫的Windows應用程序。SQL中的空白C#

我有文本字段我的應用程序中,並更新這樣的數據庫:

string name = textBox60.Text; 

string sql = "insert into myTable(Name) values ('" + name + "')"; 
DbHelper.ExecuteNonquery(sql); 

public static int ExecuteNonquery(string sql) 
    { 
     using (SqlConnection cn = new SqlConnection(constr)) 
     { 
      if (cn.State == ConnectionState.Closed) 
      { 
       cn.Open(); 
      } 
      else if (cn.State == ConnectionState.Open) 
      { 
       cn.Close(); 
       cn.Open(); 
      } 
      else if (cn.State == ConnectionState.Broken) 
      { 
       cn.Close(); 
       cn.Open(); 
      } 
      using (SqlCommand cm = new SqlCommand(sql, cn)) 
      { 
       return cm.ExecuteNonQuery(); 
      } 
     } 
    } 

但對於數據庫中的nchar類型的每一個數據,他們是全白的空間。例如,如果我在文本字段中填寫abc,那麼當我檢查數據庫時,它將變成"abc___________________"(空格)。

如何防止這種情況,而不僅僅是當我讀取它們或修改字符串時使用UPDATE數據SET TRIM(data)如果我有大量這樣的數據。

感謝您的幫助。

+1

您應該將列類型更改爲'NVARCHAR'以避免這種情況... – 2013-03-25 07:04:49

+0

'NCHAR(n)'將由SQL Server填充到'n'的長度 - 這是使用列聲明指定的大小。對於數據類型「CHAR」的變量列和固定大小列之間的區別,請閱讀以下內容:http://msdn.microsoft.com/en-us/library/ms186939.aspx – 2013-03-25 07:07:46

+0

它的工作原理,謝謝 – AkariKamigishi 2013-03-25 07:08:45

回答

12

但是對於數據庫中每種類型爲nchar的數據,它們都充滿了空格。

是的,這是因爲nchar類型是一個固定寬度類型。你基本上是告訴數據庫你需要該字段的每個值都有20(或者其他設置)的長度。您應該使用nvarchar代替,這是一個變量寬度字段。

你應該避免寫這樣的代碼:

string sql = "insert into myTable(Name) values ('" + name + "')"; 

相反,你應該使用參數化的SQL,將在SQL本身的佔位符參數,然後在命令設置值的參數。這將避免SQL injection attacks,數據轉換問題,並保持您的代碼(SQL)與數據(參數)完全分離。這意味着你需要改變你的幫手方法。 (你的helper方法看起來很奇怪 - 當你剛剛創建連接時,你只需要打開它...是你沒有在每個連接上創建一個新連接對象的時候留下的代碼呼叫?)

+0

謝謝提示 – AkariKamigishi 2013-03-25 07:25:05

+0

另外,在SQL中不使用參數是減慢數據庫速度的最佳方式。當DB接收到你的SQL時,它首先需要解析它,然後計算如何執行查詢的計劃。這是大量的處理。現在,如果使用參數,DB可以緩存解析的SQL和執行計劃,並在隨後的SQL中使用它。它將只填寫不同的參數值。如果不使用參數,則強制DB始終執行此計算,從而減慢數據庫的速度。 – 2013-03-25 09:27:08

6

因爲您已經使用char(n)而不是varchar(n)聲明瞭數據庫表,所以它始終是固定長度,如果提供較短的字符串,則會用空格填充。

如果您不想使用空格,請將該列聲明爲varchar(n)


此外,我不知道所有的儀式的是,你用的連接做你使用它之前,但似乎主要是沒有意義的。你剛纔打電話給new SqlConnection(...)。實際上根據定義,這意味着cn將被關閉 - 不需要檢查其狀態。請撥打Open()並繼續創建您的命令。


(上述所有在柱上前提被宣佈爲char(n);如果是nchar(n),那麼你應該切換到nvarchar(n))。