2013-03-25 40 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))。