0

假设我想通过主键反射动态创建一个 SQL SELECT 语句。我在表中搜索主键,然后做出声明。

问题是,在获取主键之前,我不知道构成主键的字段类型。所以,如果它是一个字符串或日期,我必须添加引号,但如果它是一个 int。

自动取款机,我正在这样做:

var type = field.GetType().Name;
if (type.ToLower().StartsWith("string") || type.ToLower().StartsWith("date"))
{
    field = "\"" + field + "\"";
} else if (type.ToLower().StartsWith("char"))
{
    field = "\'" + field + "\'";
}

使用这段代码,我可以处理一些 SQL 类型,但还有更多。

我的问题是它与 LinQ 结合使用。我从上下文中得到了一个 DataContext 对象和一个泛型类型表。而 context.ExecuteQuery 只允许传递的参数有值。我也尝试过 Dynamic LinQ 但我遇到了同样的问题

有谁知道更好的解决方案?

4

2 回答 2

4

这简直是​​编写 SQL 的错误方法。参数化它,所有这些问题都会消失(就像“使用哪种日期格式”等问题一样。当然还有大问题:SQL注入。

然后它就变成了添加@whatever到 TSQL 中并使用cmd.Parameters.AddWithValue("whatever", field)(或类似)的情况。


更新(来自评论):因为你提到你正在使用DataContext.ExecuteQuery,这变得更容易:该方法使用约定完全参数化string.Format,即

object field = ...;
var obj = db.ExecuteQuery<SomeType>(
      "select * from SomeTable where Id = {0}", field).ToList(); // or Single etc

无需进行字符串转换。

(最后一个参数是 a params object[],因此您可以传递多个谨慎的术语,或者object[]如果术语的数量在编译时不固定,您可以填充并传递它;数组中的每个术语映射(从零开始)查询中{0}, {1}, {2}... etc 标记的索引)

于 2012-10-29T08:54:49.460 回答
2

您是否尝试过使用参数?例如,如果您使用 SQLServer 作为数据库并且想要执行此查询:

"SELECT * FROM someTable WHERE id = " + field;

然后你应该使用这样的东西:

"SELECT * FROM someTable WHERE id = @field"

并将参数添加到您的命令中:

SqlParameter param1 = new SqlParameter("@field", field);
command.Parameters.Add(param1);

编辑:请注意,对于不同的数据库提供程序,SQL 查询的语法是不同的,Access 的语法是相同的

"SELECT * FROM someTable WHERE id = ?";
command.Parameters.AddWithValue("field", field);
于 2012-10-29T09:03:11.410 回答