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)
,如果我有吨这样的数据。
但是对于数据库中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)
)