【问题标题】:SQL nvarchar to C# CLRSQL nvarchar 到 C# CLR
【发布时间】:2013-10-23 13:54:45
【问题描述】:

我在 SQL 中有一个存储过程,它将数据库名称和服务器名称传递给用 C# 编写的程序集。 c#汇编中调用的方法如下

Private static void GetData(string dbname, string servername)
{
   ---blah
   ---blah
   ---blah
}

我遇到的问题是当 SQL 实例名称或数据库名称有反斜杠时(例如machinename\2008r2)。

运行存储过程无法识别的字符\ 时出现异常。在调用程序集之前,我尝试了一些基本的操作,例如在存储过程中将 \ 替换为 \\,但这也失败了。

提前致谢。

【问题讨论】:

  • 将 \ 解释为转义字符的问题只会出现在字符串 literals 中,或者如果您将字符串传递给其他系统(例如 Regex)这也使用 \ 作为转义字符。如果值通过string 参数到达您的代码中,则应该没有问题。您的问题中没有足够的代码来查看问题 - 您向我们展示的只是一个签名。
  • 调用方法后失败,因此只有方法定义。方法中的第一行是 throw new exception("In GetData()");这是为了证明控制已经进入方法。但是永远不会引发异常。
  • 那么,我希望很明显地提到,错误出现在您没有向我们展示的代码中。鉴于这显然是一个私有方法,其他一些代码正在调用它 - 那里有问题吗?

标签: c# sql string clr .net-assembly


【解决方案1】:

确保在将字符串传递给存储过程之前进行参数化。不知道您将什么设置为数据访问代码,但例如 SqlCommand 类包含一个参数集合:

 SqlCommand command= new SqlCommand("StoredProc", connection);
 command.CommandType = CommandType.StoredProcedure;
 command.Parameters.Add("@name", SqlDbType.NVarChar);
 command.Parameters["@name"].Value = dbName;
 command.Parameters.Add("@server", SqlDbType.NVarChar);
 command.Parameters["@server"].Value = server;

【讨论】:

    【解决方案2】:

    这是一个转义字符。您需要使用两个反斜杠。

    (例如)

     {MachineName\\\NamedInstance} 
    

    【讨论】:

    • 是的,没错。在我的存储过程中,我尝试用 \\ 替换实例名称和数据库名称。我仍然遇到同样的问题。这与 sql 如何将字符串传递给 clr 程序集有关。
    猜你喜欢
    • 2017-08-14
    • 2011-10-24
    • 2010-09-26
    • 1970-01-01
    • 2016-08-23
    • 1970-01-01
    • 2014-10-13
    • 2014-04-06
    • 2011-09-15
    相关资源
    最近更新 更多