C#多行字符串允许调用变量

4

我已经搜索过,但无法找到这个问题的答案:

我知道c#中有多行字符串。但是如何创建像这样的字符串:

string temp = @"DECLARE @rolename varchar(max)
SET @rolename ='***' 
EXEC sp_addrolemember N'db_execute',@rolename"

*代表我需要声明一个具有某些值的变量,例如(object.variable)。

这个可能吗?


1
嗯,如果可能的话,您最好使用SqlParameter来完成。将文本注入SQL查询可能是一个不好的习惯。 - Joachim Isaksson
4个回答

10

.NET支持多行字符串,当然。 @"..."语法只是一种简化语言的快捷方式。但是,在您的具体示例中,您不应该尝试连接该值:整个示例应通过参数完成:

cmd.CommandText = "EXEC sp_addrolemember N'db_execute',@rolename";
cmd.Parameters.AddWithValue("rolename", yourRoleName);

更新:查看msdn,第二个参数实际上是成员名称,但您也可能能够使用:

cmd.CommandText = "sp_addrolemember";
cmd.CommantType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("rolename", "db_execute");
cmd.Parameters.AddWithValue("membername", yourMemberName);

5
您可以使用 string.Format
string temp = @"DECLARE @rolename varchar(max)
SET @rolename ='{0}' 
EXEC sp_addrolemember N'db_execute',@rolename";

string result = string.Format(temp, object.variable);

请注意,如果object.variable是(或将来可能成为)用户定义的变量,则会存在SQL注入攻击的风险。

4
这是一种SQL注入风险,请注意 - 根据角色名是否被列入白名单而定。 - Marc Gravell
1
如果这是仅允许的少数硬编码值之一,那么它可能是可以的;如果它来自用户输入且未经验证,则可能不可行。@vysakh - Joachim Isaksson
@Brian:尽管我同意如果可能应始终使用sql参数,但并不清楚OP是否在查询数据库。他没有提到数据库或展示他使用ADO.NET的代码。所以也许这只是一个(糟糕的)例子,或者他正在构建类似于SQL生成器工具之类的东西。 因此,如果有类似SQL的东西,就不能说永远不要使用“String.Format”是太笼统了。 - Tim Schmelter
@TimSchmelter:在您上面的示例中,应该将temp变量替换为{0}以实现输出吗? - vysakh
@vysakh:是的 :) 刚刚阅读了我上面发布的MSDN教程。这是链接:http://msdn.microsoft.com/en-us/library/system.string.format.aspx - Tim Schmelter
显示剩余6条评论

3

使用 string.Format 方法:

string temp = string.Format(@"DECLARE @rolename varchar(max)
SET @rolename ='{0}' 
EXEC sp_addrolemember N'db_execute',@rolename", variable);

4
这是一种SQL注入风险,请注意 - 具体取决于角色名称是否在白名单中。 - Marc Gravell

1

Yes its possible:

string temp = string.Format(@"DECLARE @rolename varchar(max)
SET @rolename ='{0}' 
EXEC sp_addrolemember N'db_execute',@rolename", variable);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接