我正在尝试使用OleDbCommand参数化SQL创建以避免SQL注入。所以,我想要一个可以做到的常用方法并返回一个我可以进一步使用的对象。
我想使用页面上的代码:http://msdn.microsoft.com/en-us/library/system.data.oledb.oledbcommand.parameters.aspx
public void CreateMyOleDbCommand(OleDbConnection connection,
string queryString, OleDbParameter[] parameters)
{
OleDbCommand command = new OleDbCommand(queryString, connection);
command.CommandText =
"SELECT CustomerID, CompanyName FROM Customers WHERE Country = ? AND City = ?";
command.Parameters.Add(parameters);
for (int j=0; j<parameters.Length; j++)
{
command.Parameters.Add(parameters[j]) ;
}
string message = "";
for (int i = 0; i < command.Parameters.Count; i++)
{
message += command.Parameters[i].ToString() + "\n";
}
Console.WriteLine(message);
}
问题1.它将参数作为值传递。那么,我必须在最后调用connection.Close
吗?上述链接中未提及connection.Close
,是否需要?在代码执行期间,我不希望连接到我的数据库。
问题2.我原来的代码是:
dbReader = new OleDbCommand("select * from Table1 where Table1.Company = '" + company + "'", dbConnection).ExecuteReader();
dbReader.Read();
if (dbReader.HasRows)
{
//Do operations using dbReader["Company"]
}
和
new OleDbCommand("...insert sql query...", dbConnection).ExecuteNonQuery()
我应该退回OleDbCommand command
吗?我可以command.ExecuteReader()
和command..ExecuteNonQuery()
答案 0 :(得分:2)
你展示的例子非常糟糕。我认为微软应该在他们的网站上告知这个非常糟糕的代码。
我会尝试做一个更好的例子并解释原因
public OleDbCommand CreateMyOleDbCommand(OleDbConnection connection,
string queryString, OleDbParameter[] parameters)
{
OleDbCommand command = new OleDbCommand(queryString, connection);
command.Parameters.AddRange(parameters);
return command;
}
首先,该方法应返回OleDbCommand及其参数并正确初始化其commandtext。所以我已经将方法的返回值从void更改为OleDbCommand。通过这种方式,您可以使用调用代码中的命令来执行查询。
其次OleDbCommand有一个构造函数,它接收命令文本和连接。使用此构造函数构建OleDbCommand将避免以后传递命令文本并设置与参数的连接。
第三,要将参数数组添加到OleDbCommand的参数集合中,您需要使用Parameters集合的AddRange方法。
现在在您的调用代码中,您已经定义了OleDbConnection,您可以调用此方法,打开连接并执行命令(ExecuteReader,ExecuteNonQuery或ExecuteScalar,具体取决于命令文本)。当然,在你打开连接的地方也可以关闭它