我目前正在尝试使用sql join语句来恢复程序所需的结果。当我尝试将其中一个数据库名称更改为变量时,它显示异常“System.Data.SqlClient.SqlException(0X80131904):'。'附近的语法不正确。”两个数据库都在同一个SQL服务器上。如果我使用字符串中的一个数据库名称,它将连接并按预期执行语句。仅当我将数据库名称作为参数时才会出现这种情况:
using (var command = new SqlCommand("select p.Tablefield, P.TableFeild, es.SynchronousIn, es.SynchronousOut, " +
"es.dddd, es.MessageName, es.MessageDate from database.xxx.xxx es " +
"join @Database.dbo.xxxx p on p.GUID = es.dddd where es.MessageName = @MessageType and " +
"(es.MessageDate >= @date and es.MessageDate < @date)" +
"and es.dddd = @ddddd " +
"order by MessageDate DESC" , connection))
之后定义@Database参数:
command.Parameters.Add("@Database", SqlDbType.NVarChar);
command.Parameters["@Database"].Value = DatabaseName;
有什么想法吗?我知道这可能不是最好的方法,我对c#的SQL方面很新,并想知道这是否可行。我用XXXX或DDDD替换了某些字段,因为这是我希望为我公司写的工具。
答案 0 :(得分:1)
您无法将数据库名称作为参数传递。您可以使用String.Format
在sql命令字符串上添加它。
这样的事情:
String.Format("select p.Tablefield, P.TableFeild, es.SynchronousIn, es.SynchronousOut, " +
"es.dddd, es.MessageName, es.MessageDate from database.xxx.xxx es " +
"join {0}.dbo.xxxx p on p.GUID = es.dddd where es.MessageName = @MessageType and " +
"(es.MessageDate >= @date and es.MessageDate < @date)" + "and es.dddd = @ddddd " +
"order by MessageDate DESC", DatabaseName);
答案 1 :(得分:1)
检查以下内容:
String.Format("select p.Tablefield, P.TableFeild, es.SynchronousIn, es.SynchronousOut, " +
"es.dddd, es.MessageName, es.MessageDate from database.xxx.xxx es " +
"join {0}.dbo.xxxx p on p.GUID = es.dddd where es.MessageName = @MessageType and " +
"(es.MessageDate >= @date and es.MessageDate < @date)" + "and es.dddd = @ddddd " +
"order by MessageDate DESC", DatabaseName);
答案 2 :(得分:0)
您无法将表名作为参数传递。您只需使用string.Format
将表名插入SQL字符串即可。像...这样的东西。
using (var command = new SqlCommand("select p.Tablefield, P.TableFeild, es.SynchronousIn, es.SynchronousOut, " +
"es.dddd, es.MessageName, es.MessageDate from database.xxx.xxx es " +
string.Format("join @{0}.dbo.{1} p on p.GUID = es.dddd where es.MessageName = @MessageType and ",databaseName,tableName) +
"(es.MessageDate >= @date and es.MessageDate < @date)" +
"and es.dddd = @ddddd " +
"order by MessageDate DESC" , connection))
如果以任何方式从用户界面操作,请务必检查此SQL注入值。