gpt4 book ai didi

具有动态参数的 C# SQLite Insert 函数

转载 作者:行者123 更新时间:2023-12-01 23:52:09 29 4
gpt4 key购买 nike

好吧,也许标题有点奇怪,但我会尽力解释一下。

我正在开发一个带有 SQLite 数据库文件的 C# 应用程序。我有一个数据库类,其中包含与数据库通信的所有函数。

我有一个带有此代码的 Insert 函数(注意,这不是我做的):

public bool Insert(String tableName, Dictionary<String, String> data)
{
String columns = "";
String values = "";
Boolean returnCode = true;
foreach (KeyValuePair<String, String> val in data)
{
columns += String.Format(" {0},", val.Key.ToString());
values += String.Format(" '{0}',", val.Value);
}
columns = columns.Substring(0, columns.Length - 1);
values = values.Substring(0, values.Length - 1);
try
{
this.ExecuteNonQuery(String.Format("insert into {0}({1}) values({2});", tableName, columns, values));
}
catch (Exception fail)
{
MessageBox.Show(fail.Message);
returnCode = false;
}
return returnCode;
}

一切看起来都不错。但我想通过参数化查询来防止一些SQLInjection。但问题是,查询永远不会具有相同的长度。那么我该如何处理呢?

我的意思是:我想为 3 列的表和 8 列的表使用这个单一函数。一切都是动态的。有谁知道如何做到这一点(以一种好的/正确的方式)?

最佳答案

我将您的插入函数重写为 InsertSecure 方法,
现在您可以使用参数插入所有值。

我在代码中添加了一些注释,以便更好地理解如何调整您的程序。
然后,您可以这样调用:

public void HowToCall()
{
// I assume that "columnA" and "columnB" is set by you and it is safe,
// unsafe are values "valueA" and "valueB"
Dictionary<string, string> data = new Dictionary<string, string>()
{ { "columnA", "valueA" }, { "columnB", "valueB" } };
// then call new method
InsertSecure("table_name", data);
}

插入安全内容:

public bool InsertSecure(String tableName, Dictionary<String, String> data)
{
// table name can not contains space
if (tableName.Contains(' ')) { return false; }
String columns = "";
String values = "";
Boolean returnCode = true;
foreach (KeyValuePair<String, String> val in data)
{
columns += String.Format(" '{0}',", val.Key.ToString());
// all values as parameters
values += String.Format(" @{0},", val.Key.ToString());
}
columns = columns.Substring(0, columns.Length - 1);
values = values.Substring(0, values.Length - 1);
try
{
// setup your connection here
// (connection is probably set in your original ExecuteNonQuery)
SQLiteConnection cnn = new SQLiteConnection();
cnn.Open();
SQLiteCommand cmd = cnn.CreateCommand();
cmd.CommandType = System.Data.CommandType.Text;
// prepare insert command based on data
cmd.CommandText = String.Format("insert into {0} ({1}) values ({2})",
tableName, columns, values);

// now your command looks like:
// insert into table_name (columnA, columnB) values (@columnA, @columnB)
// next we can set values for any numbers of columns
// over parameters to prevent SQL injection
foreach (KeyValuePair<String, String> val in data)
{
// safe way to add parameter
cmd.Parameters.Add(
new SQLiteParameter("@" + val.Key.ToString(), val.Value));
// you just added for @columnA parameter value valueA
// and so for @columnB in this foreach loop
}
// execute new insert with parameters
cmd.ExecuteNonQuery();
// close connection and set return code to true
cnn.Close();
returnCode = true;
}
catch (Exception fail)
{
MessageBox.Show(fail.Message);
returnCode = false;
}
return returnCode;
}

我认为您可以使用此过程安全地插入数据。

注意:我没有项目来测试它,如果写得正确的话,
但没有语法错误,逻辑看起来也不错。请尝试并享受。

关于具有动态参数的 C# SQLite Insert 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21419130/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com