Ham*_*mid 6 sql-server query c#
ms sql server 中是否有任何选项为我的数据库使用 N 前缀。我的应用程序中有很多查询,其中没有一个对 nvarchar 字段使用 N 前缀,现在我必须为所有这些查询设置 N,这需要很长时间。我的校对是 Persian_100,它需要 unicode(N 前缀)所以任何建议表示赞赏
select * from table1 where field1=N'????' ;
Run Code Online (Sandbox Code Playgroud)
我想在我的查询中跳过 N 前缀,但它充当所有类型查询的 unicode:
不,没有办法做到这一点。
任何执行您想要的操作的选项都会非常令人困惑,因为需要有一种方法在字符串文字语法中将其关闭。选择数据类型时还需要注意其他注意事项(例如存储大小),因此使用这样的设置可能非常危险。
对于将参数化 T-SQL 语句发送到 SQL Server 的 .NET 应用程序,该框架会为您处理此问题,因为 .NETString本质上支持 Unicode,并且事物是使用该假设构建的。如果 ORM 类型的库编程得当的话,这也适用于它们。
考虑以下代码片段:
IDbCommand cmd = connection.CreateCommand();
cmd.CommandText = @"SELECT * FROM sys.server_principals WHERE name = @name";
IDbDataParameter param = cmd.CreateParameter();
param.DbType = DbType.String;
param.ParameterName = "@name";
param.Value = "dbo";
cmd.Parameters.Add(param);
IDataReader dr = cmd.ExecuteReader();
Run Code Online (Sandbox Code Playgroud)
实际发送到 SQL Server 的内容是这样的(为了清楚起见,添加了换行符):
exec sp_executesql N'SELECT * FROM sys.server_principals WHERE name = @name',
N'@name nvarchar(3)',@name=N'dbo'
Run Code Online (Sandbox Code Playgroud)
您可以看到框架自动使用 Unicode 类型作为参数(3 的长度完全是一个单独的讨论......)。
需要修改代码的地方是 SQL 查询未参数化(或不可参数化,即 DDL)的情况——换句话说,查询的参数直接连接到字符串中,或包含字符串常量。有关如何在使用动态 SQL 时避免 SQL 注入问题的示例,请参阅我的回答。