0

那么有人可以告诉我为什么注释掉的工作,而最后两行没有?我正在使用紧凑的框架 c# 从 sqLite 数据库返回一行。

            //String sqlcomm = "SELECT * FROM Asset WHERE " + assetColName + " = \'" + assetColValue + "\'";
            //command.CommandText = sqlcomm;
            command.CommandText = @"SELECT * FROM Asset WHERE $assetColName = '$assetColValue'";
            command.Parameters.AddWithValue("$assetColName", assetColName);
            command.Parameters.AddWithValue("$assetColValue", assetColValue);
4

3 回答 3

1

通常,您不能参数化列名。尝试使用根据您注释掉的行输入的列名构建命令文本,但仍然使用列值的参数。

于 2013-09-25T00:13:32.667 回答
0

我想出了一种方法来解决参数化列名的问题。我想出了一种不同的方法,因为我是唯一一个使用列名的人,所以我相信这仍然是一个安全的选择。

            String sqlcomm = "SELECT * FROM Asset WHERE " + assetColName + " = ";
            command.CommandText = sqlcomm + "$assetColValue";

            //command.CommandText = @"SELECT * FROM Asset WHERE $assetColName = '$assetColValue'";
            //command.Parameters.AddWithValue("$assetColName", assetColName);

            command.Parameters.AddWithValue("$assetColValue", assetColValue);

从上面的代码可以看出。然后我将字符串连接在一起,并能够使用我的参数化列名和值,然后安全地添加值。然而,列名是不安全的,但这是一种只有我会使用的方法,所以它仍然有点安全。如果我想更安全,我可以添加正则表达式,但你知道修复的想法。

有人预见到这个问题吗?

于 2013-09-25T15:17:59.803 回答
0

您始终可以使用 INFORMATION_SCHEMA 表检查列是否存在。

INFORMATION_SCHEMA 的用法:http: //blog.sqlauthority.com/2011/10/02/sql-server-ce-list-of-information_schema-system-tables/

TSQL 示例: 如何检查 SQL Server 表中是否存在列

于 2013-09-26T10:24:16.447 回答