2

我有一个用 C# 编写的 Windows 应用程序,它连接到 SQL 数据库。

我的应用程序中有文本字段,并像这样更新数据库:

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数据集之外,如何防止这种情况发生。TRIM(data)

感谢帮助。

4

2 回答 2

13

但是对于数据库中每个 nchar 类型的数据,它们都充满了空格。

是的,那是因为nchar类型是固定宽度类型。您基本上是在告诉数据库您希望该字段的每个值的长度为 20(或设置为任何值)。您应该改用nvarchar它,这是一个可变宽度字段。

应该避免编写这样的代码:

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

相反,您应该使用参数化 SQL,在 SQL 本身中放置一个占位符参数,然后在命令中设置参数的值。这将避免SQL 注入攻击、数据转换问题,并使您的代码(SQL)与数据(参数)完全分离。这将意味着您需要更改您的辅助方法。(您的辅助方法一开始看起来很奇怪 - 当然,当您刚刚创建连接时,您只需要打开它...是您没有在每个连接对象上创建新连接对象时留下的代码吗?称呼?)

于 2013-03-25T07:07:01.260 回答
6

因为您使用 achar(n)而不是 a声明了数据库表varchar(n),所以它始终是固定长度,如果您提供较短的字符串,那么它将用空格填充。

如果您不想要空格,请将列声明为varchar(n).


另外,我不确定你在使用连接之前所做的所有仪式是什么,但这似乎毫无意义。你刚刚打了电话new SqlConnection(...)。实际上,根据定义,这意味着cn它将被关闭 - 无需检查其状态。只需调用Open()它并继续创建您的命令。


(以上所有内容都基于被声明为的列char(n)。如果是,nchar(n)那么您应该切换到nvarchar(n))。

于 2013-03-25T07:05:56.387 回答