SQL和c#中的空白

本文关键字:空白 SQL | 更新日期: 2023-09-27 18:05:33

我有一个用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),如果我有吨这样的数据。

SQL和c#中的空白

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

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

你应该也应该避免这样写代码:

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

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

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

如果您不需要空格,请声明该列为varchar(n)


另外,我不确定在使用连接之前,您正在进行的所有仪式是什么,但似乎大多数都没有意义。你刚刚呼叫了new SqlConnection(...)。实际上,根据定义,这意味着cn将被关闭-不需要检查其状态。只需调用Open(),然后继续创建您的命令。


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