c# - 带有 SQL Server 数据库的 .NET Core 应用程序,其中表名带有前缀 C# - 动态表名
问题描述
我想知道是否可以将表前缀保留在配置文件中并SqlCommand
通过将其附加到实际表名来在每个查询中使用它,因此具有相同表结构的两个应用程序可以使用相同的数据库而不共享数据。
截至目前,我所有的SqlCommand
查询都是这样的:
using (var connection = new SqlConnection(connString))
{
using (SqlCommand sqlCmd = new SqlCommand("SELECT * from SomeTable", connection))
{
connection.Open();
using (SqlDataReader dr = sqlCmd.ExecuteReader())
{
if (dr.HasRows)
{
while (dr.Read())
{
Model _record = new Model();
_record.ID = Convert.ToInt32(dr["ID"]);
_record.Value = Convert.ToString(dr["Value"]);
RecordsList.Add(_record);
}
}
}
connection.Close();
return RecordsList;
}
}
或者:
using (var connection = new SqlConnection(connString))
{
using (SqlCommand sqlCmd = new SqlCommand("UPDATE SomeTable SET Value = @Value " +
"WHERE ID = @Id;", connection))
{
sqlCmd.Parameters.Add("@Value", System.Data.SqlDbType.NVarChar).Value = _record.Value;
sqlCmd.Parameters.Add("@Id", System.Data.SqlDbType.Int).Value = _record.Id;
connection.Open();
sqlCmd.ExecuteNonQuery();
connection.Close();
}
}
如您所见,我使用参数,但不能在表名上使用参数。
如果我想添加prefix_
到表名的开头,那么保护查询免受 SQL 注入的方法应该是什么,所以应用程序会与存储在设置文件中的带有前缀的表进行对话?
解决方案
这是一个简单的实用函数,用于将表名包装在分隔符中,并防止 SQL 注入。这是 TSQL QUOTENAME函数的 C# 实现:
private static string QuoteName(string identifier)
{
var sb = new StringBuilder(identifier.Length + 3, 1024);
sb.Append('[');
foreach (var c in identifier)
{
if (c == ']')
sb.Append(']');
sb.Append(c);
}
sb.Append(']');
return sb.ToString();
}
你会像这样使用它:
var sql = $"UPDATE {QuoteName(SomePrefix + "_" + SomeTable)} SET Value = @Value WHERE ID = @Id;"
推荐阅读
- javascript - 如何删除html的开头和结尾?
- ruby-on-rails - 从动态键和值获取 Ruby 哈希(MIB SNMP)
- ruby-on-rails - 如何在模型中添加消息以进行验证?
- sql-server - 由于错误 ORA-01019,通过 SSIS 连接 Oracle 失败
- php - 无法验证 Woo 商务 API
- javascript - 在 VueJs 中加载视频时显示视频(超出最大调用堆栈大小)
- javascript - 无法使用 loopbackjs 验证 nodejs 中的第一个证书
- node.js - 如何使用节点 Js 在单独的文件中建立服务器连接并使用其他文件作为主服务器文件中的函数?
- google-chrome - 11.1*9 = 99.89999999999999
- ruby-on-rails - 如何在 Ruby on Rails 的 UI 中显示进度百分比?