2013-10-23 37 views
-1

我有一个SQL存储过程,它将数据库和服务器名的名称传递给用C#编写的程序集。所谓在c#组件的方法是如下SQL nvarchar到C#CLR

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

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

我得到异常运行存储过程无法识别的字符\。我尝试了一些基本的东西,例如在调用程序集之前在存储过程中用\\代替\,这也失败了。

在此先感谢。

+0

与\被解释为转义字符的问题只能倾向于字符串出现*文字*,或者如果您将该字符串传递给也使用\作为转义字符的其他系统(例如'Regex')。如果该值通过'string'参数到达您的代码,则不会有问题。您的问题中没有足够的代码来查看问题 - 您向我们展示的只是一个签名。 –

+0

调用该方法后失败,因此只有方法定义。该方法内的第一行是 抛出新的异常(“在GetData()”); 这是为了证明控制已经进入了方法。但是这个例外从未被提出。 – Abe

+0

然后,我希望这是很明显的提及,错误是在你* *没有向我们展示的代码中。鉴于这显然是一种私人方法,其他一些代码正在调用它 - 是那里的问题吗? –

回答

0

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

(例如)

{MachineName\\\NamedInstance} 
+0

是的,这是正确的。在我的存储过程中,我尝试用\\替换实例名称和dbname。我仍然遇到同样的问题。它是如何将sql传递给clr程序集的。 – Abe

0

确保您字符串传递到存储过程的参数化之前。不知道您所设置了为您的数据访问代码,但是,例如,SqlCommand类包含一个Parameters集合:

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;