如何将新字典传递给带有字典参数的方法?

  • 本文关键字:字典 参数 方法 新字典 c#
  • 更新时间 :
  • 英文 :


我的调用 -- 我想给它传递一个充满键和值的字典

QueryBuilder query = new QueryBuilder(new SqliteConnection(@"Data Source = D:/chinook.db")); 
Dictionary<string, string> loadDictionary = new Dictionary<string, string>();

Console.WriteLine(query.Create("albums", loadDictionary)); //What do I replace loadDictionary with?

方法名称

public void Create(string tableName, Dictionary<string, string> columnsAndVals)
{
var commandText = $"insert into {tableName}(";
foreach (var item in columnsAndVals.Keys) // adds keys into command text
{
commandText += item + ",";
}
commandText += ") values("; 
foreach (var item in columnsAndVals) // adds values into command text
{
commandText += $"@{item},";
}
var cmd = new SqliteCommand(commandText, Connection);
using (cmd)
{
foreach (var item in columnsAndVals)
{
cmd.Parameters.Add($"@{columnsAndVals.Keys}, @{columnsAndVals}");
}
cmd.ExecuteNonQuery();
}
}

我正在构造一个方法,该方法将使用 sql 连接将列和值插入到 sql 数据库中。

为此,我使用字典来保存要插入的列和值。(例如插入到(tableName((columnsAndVals.Keys(值(columnsAndVals.Values(等(

我不明白的是如何在驱动程序中建立字典,然后将其作为参数传递到我的 Create 方法中。有没有办法做到这一点?

若要创建insert查询,除了表名之外,还需要有三个值列表:列名、参数名和参数值。虽然Dictionary<TKey, TValue只允许您传递两个列表(键和值(。

因此,您需要更改方法签名。我会完全拒绝Dictionary.

您可以传递三个单独的列表:

public int Create(string tableName, List<string> columnNames, List<string> parameterNames, List<object> parameterValues)

具有专门创建的类的单个列表:

class QueryValue
{
public string ColumnName { get; set; }
public string ParameterName { get; set; }
public object ParameterValue { get; set; }
}
public int Create(string tableName, List<QueryValue> values)
{
var columnNames = string.Join(",", values.Select(v => v.ColumnName));
var parameterNames = string.Join(",", values.Select(v => v.ParameterName));
var sb = new StringBuilder()
.Append("insert into ")
.Append(tableName)
.Append('(')
.Append(columnNames)
.Append(") values(")
.Append(parameterNames)
.Append(')');
var commandText = sb.ToString();
//Console.WriteLine(commandText); // to see result
using (var cmd = new SqliteCommand(commandText, Connection))
{
foreach (var value in values)
{
cmd.Parameters.Add(value.ParameterName, value.ParameterValue);
}
return cmd.ExecuteNonQuery();
}
}

像这样调用该方法:

var values = new List<QueryValue>
{
new QueryValue{ ColumnName="a", ParameterName="@a", ParameterValue="aa" },
new QueryValue{ ColumnName="b", ParameterName="@b", ParameterValue="bb" },
new QueryValue{ ColumnName="c", ParameterName="@c", ParameterValue="cc" }
};
int rowsAffected = Create("albums", values);

请注意,ExecuteNonQuery方法返回受影响的行数。因此,我们的Create方法返回int

您还可以使用元组而不是单独的类。


但是,我强烈反对这种方法。它们的使用看起来相当歪歪扭扭,充满了错误。

每个表都必须定义自己的插入方法,以及选择、更新和删除。

例如

public int InsertUser(int id, string name)
{
var commandText = "insert into User (id, name) values (@id, @name)";
using (var cmd = new SqlCommand(commandText, Connection))
{
cmd.Parameters.Add("id", id);
cmd.Parameters.Add("name", name);
return cmd.ExecuteNonQuery();
}
}

当然,会有很多这样的方法,但它们的使用要容易得多,而且更不容易出错。

最新更新