【问题标题】:nVarchar and SqlParameternVarchar 和 SqlParameter
【发布时间】:2011-01-18 23:18:18
【问题描述】:

我正在开发一个必须支持多种语言的应用程序。为了解决特殊字符问题,我将 NVarhcar 用于我的文本字段。所以我对文本字段的 SQL 查询是

insert into tbl_text(text)values(N'Chci tančit v oblasti')

我的问题是将它放在 SqlCommand 中,即"insert into tbl_text(text)values(N@text)"。当然,它会将"N@text" 保存在数据库表中。

你们知道怎么做吗?我正在使用 C# 和 SQL 2008。

抱歉,如果我的问题难以理解。我的英语很差=/

【问题讨论】:

  • 你的陈述究竟是如何运作的?尝试从 SSMS 中将 N@text 插入到 tbl_text.text 列中时,我得到 Msg 207, Level 16, State 1, Line 4 Invalid column name 'N@text'.

标签: c# nvarchar sqlparameter


【解决方案1】:

Add(string, object) 由于这个原因已被弃用(来自 SQL Server 团队的 Pablo Castro):

问题是 C# 和 VB.NET 编译器将暴露非常 这段代码的奇怪行为:

command.Parameters.Add(“@p”, 0);

您可能希望它使用 需要一个对象的重载和 将值 0 分配给它,但是 它会选择需要一个 SqlDbType 作为第二个参数!在 为了避免这种情况(并且可能 其他)之间的歧义 添加(字符串,sqldbtype)和添加(字符串, 对象),我们弃用了 Add(string, 对象)并介绍 AddWithValue(字符串,对象)。在 一般,有多个重载 其中区别参数 类型是“对象”,其中一个是 做危险的事情。

【讨论】:

    【解决方案2】:

    您应该使用SqlParameters 参数化您的插入,这允许您明确指定数据类型。 (它还让您免于弄清楚您的查询导致的 SQL Server 注入攻击)。

    示例:

    SqlCommand cmd  = new SqlCommand("insert into tbl_text (text) values(@MYTEXT)", myConnection);
    cmd.Parameters.Add(new SqlParameter("@MYTEXT", SqlDbType.NVarChar)).Value = "Chci tančit v";
    cmd.ExecuteNonQuery();
    

    【讨论】:

    • 我会将 Add 的方法更改为 AddWithValue 因为 Add 已被弃用...我现在没有电脑所以我不能给你确切的代码...但如果没有人回答,等我回家我一定会发的:)
    • @PredoC88 你从哪里得到这些信息?刚刚检查了msdn.microsoft.com/en-us/library/ht4eset1.aspx,它似乎没有被弃用。
    • @BrokenGlass 他指的是SqlParameterCollection.Add(string, object),这是一种方便的方法。你真的应该使用IDbCommand.CreateParameter() 而不是直接实例化SqlParameter 并从SqlParameter 中删除@ 以减少对System.Data.SqlClient 命名空间的依赖:-p。
    【解决方案3】:

    参数名前不要加“N”,仅在使用字符串常量表示为unicode字符串时使用。所以你的查询应该是:

    insert into tbl_text(text) values (@text)
    

    【讨论】:

    • 我不推荐这个想法,因为它会让你对 sql 注入敞开心扉,去使用 SQLParameter 的其他过程......它真的很容易使用而且更安全。
    • 使用@text 意味着它与SQL 参数一起使用。
    【解决方案4】:

    使用SQLParameters

    这是一个简单的例子:

    var cmd = _dbCon.CreateCommand();
    cmd.CommandText =
        "insert into tbl_text (textfield) values(@textfield)";
    cmd.Parameters.Add(new SQLParameter("@textfield", "Chci tančit v oblasti"));
    cmd.ExecuteScalar();
    

    【讨论】:

    • 你为什么把 č 改成问号?您是否使用过时的 1980 年代软件访问该网站? (我已经为你修好了。)
    【解决方案5】:

    这是一个简单的例子

    String filePath = @"D:\" + FileName;
    SqlCommand command = new SqlCommand();
    command.Connection = connection;
    command.CommandText = 
        @"DECLARE @TraceId INT = (SELECT MAX(id) FROM sys.traces WITH (NOLOCK))
        SET @TraceId=@TraceId+1
    
        DECLARE @File NVARCHAR(256);
        Set @File= (@filePath)
    
        SET @TraceId=@TraceId+1 --Var olandan bir fazla
    
        DECLARE @MaxFileSize BIGINT = 1 /* max size of file as MegaByte*/
        DECLARE @FileCount INT = 1024 /* max file count for write*/
    
        exec sp_trace_create @traceid = @TraceId OUTPUT,
                                        @options = 2,
                                        @tracefile = @File,
                                        @maxfilesize = @MaxFileSize, 
                                        @stoptime = NULL,
                                        @filecount = @FileCount
    
        SELECT @TraceId";
    
    command.Parameters.Add(new SqlParameter("@filePath", SqlDbType.NVarChar)).Value = filePath;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-16
      相关资源
      最近更新 更多