向方法发送未指定数量的参数
Send an Unspecified Number of Parameters to a Method
我有一个程序,目前被硬编码为将用户输入的一些参数发送到 DBF 文件中。我不能将参数留空(DBF 似乎不允许这样做)所以现在我只是简单地输入一个空白,这不一定是个问题。
这是目前的方法;
public bool SendToDBF(string name, string town, string pcode)
{
int id, querytype, personID;
string whatfile, netname, whatProgram, blank;
id = 1;
whatfile = "Compns";
querytype = 1;
netname = Environment.UserName;
personID = 8948;
whatProgram = "Sales";
blank = "";
try
{
string constr = ConfigurationManager.ConnectionStrings["dbfString"].ConnectionString;
using (var dbfCon = new OleDbConnection(constr))
{
dbfCon.Open();
var dbfCmd = new OleDbCommand("INSERT INTO fromsql VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", dbfCon);
dbfCmd.Parameters.Clear();
dbfCmd.Parameters.AddWithValue("@fq_uniqid", id);
dbfCmd.Parameters.AddWithValue("@fq_whfile", whatfile);
dbfCmd.Parameters.AddWithValue("@fq_what", querytype);
dbfCmd.Parameters.AddWithValue("@fq_whonm", netname);
dbfCmd.Parameters.AddWithValue("@fq_whoid", personID);
dbfCmd.Parameters.AddWithValue("@fq_whoprog", whatProgram);
dbfCmd.Parameters.AddWithValue("@param1", name);
dbfCmd.Parameters.AddWithValue("@param2", town);
dbfCmd.Parameters.AddWithValue("@param3", pcode);
dbfCmd.Parameters.AddWithValue("@param4", blank);
dbfCmd.Parameters.AddWithValue("@param5", blank);
dbfCmd.Parameters.AddWithValue("@param6", blank);
dbfCmd.Parameters.AddWithValue("@param7", blank);
dbfCmd.Parameters.AddWithValue("@param8", blank);
dbfCmd.Parameters.AddWithValue("@param9", blank);
dbfCmd.Parameters.AddWithValue("@param10", blank);
dbfCmd.Parameters.AddWithValue("@param11", blank);
dbfCmd.Parameters.AddWithValue("@param12", blank);
dbfCmd.Parameters.AddWithValue("@param13", blank);
dbfCmd.Parameters.AddWithValue("@paraml1", blank);
dbfCmd.Parameters.AddWithValue("@paraml2", blank);
dbfCmd.ExecuteNonQuery();
return true;
}
}
catch (OleDbException ex)
{
MessageBox.Show("Error Updating MySQL: " + ex);
return false;
}
}
我想要的是,发送到 DBF 的参数数量取决于用户为公司填写的字段数量,例如,如果他们只填写姓名、城镇和 post 代码那么 SendToDBF 将采用 3 params
以及预定义参数,例如 ID
、Whatfile
和 QueryType
.
有什么方法可以让 SendToDBF 接受一个未指定数量的参数,并用空白填充其余用户没有输入的参数?
您可以使用 params
:
public bool SendToDBF(params string[] parameters)
{
}
public bool SendToDBF(params object[] parameters)
{
}
如果类型总是 string
你可以使用 params
keyword in C#:
public static void TestParams(params string[] Params)
{
foreach (string param in Params)
{
Console.WriteLine(param);
}
}
然后根据Params
中的索引确定值名称
示例:
public static void TestParams(params string[] Params)
{
// init dbf up here
int maxParams = 12;
for(int i = 1; i <= maxParams; i++)
{
string paramName = "@param" + i;
if(Params.Length >= i)
dbfCmd.Parameters.AddWithValue(paramName, Params[i - 1]); // array index is zero-based
else
dbfCmd.Parameters.AddWithValue(paramName, blank);
}
}
我不知道你的问题的确切上下文,但你可以:
- 将您的参数列表转换为具有键/值的字典(字典或字典),这样您就可以将准确的参数传递给您的方法,这样您就不会混淆每个参数的顺序。
所以你会有一个
new Dictionary<string, string> { {"firstName": "John"}, {"age": "42"} }
对于其余的参数,有一个带有键的数组,您可以在其中比较并用空白填充剩余的(我猜您的程序需要所有参数)
或另一种选择:使用包含所有参数的默认字典,每列都有默认值:
new Dictionary<string, string> { "status": "1" }
然后您只需将默认值与参数合并,然后将所有键和值添加到命令中。
参见:Merging dictionaries in C#
- 如果参数的顺序不重要(我对此表示怀疑),您可以使用 params 关键字。请参阅 Why use the params keyword? 了解何时使用。
我会建立一个字段名称和值的字典,并自己构建 SQL。您可以从方法中传入字典,也可以在内部构建它。
Dictionary<string, object> d = new Dictionary<string, object>();
d["personID"] = 1234;
// ...
SQL可以这样构建:
StringBuilder sb = new StringBuilder();
sb.Append("insert into ");
sb.Append(tableName);
sb.Append(" (");
StringBuilder sbValues = new StringBuilder();
sbValues.Append("values (");
bool first = true;
foreach (KeyValuePair<string, object> kvp in d)
{
if (first)
{
first = false;
}
else
{
sb.Append(", ");
sbValues.Append(", ");
}
sb.Append(kvp.Key);
sbValues.Append("?");
// put the value in a SQL parameter;
dbfCmd.Parameters.AddWithValue("@" + kvp.Key, kvp.Value);
}
sb.Append(") ");
sbValues.Append(")");
sb.Append(sbValues.ToString());
string fullSql = sb.ToString();
它将构建值字符串和 SQL 语句的其余部分分开,因为您还需要遍历集合两次,这似乎没有必要。
我有一个程序,目前被硬编码为将用户输入的一些参数发送到 DBF 文件中。我不能将参数留空(DBF 似乎不允许这样做)所以现在我只是简单地输入一个空白,这不一定是个问题。
这是目前的方法;
public bool SendToDBF(string name, string town, string pcode)
{
int id, querytype, personID;
string whatfile, netname, whatProgram, blank;
id = 1;
whatfile = "Compns";
querytype = 1;
netname = Environment.UserName;
personID = 8948;
whatProgram = "Sales";
blank = "";
try
{
string constr = ConfigurationManager.ConnectionStrings["dbfString"].ConnectionString;
using (var dbfCon = new OleDbConnection(constr))
{
dbfCon.Open();
var dbfCmd = new OleDbCommand("INSERT INTO fromsql VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", dbfCon);
dbfCmd.Parameters.Clear();
dbfCmd.Parameters.AddWithValue("@fq_uniqid", id);
dbfCmd.Parameters.AddWithValue("@fq_whfile", whatfile);
dbfCmd.Parameters.AddWithValue("@fq_what", querytype);
dbfCmd.Parameters.AddWithValue("@fq_whonm", netname);
dbfCmd.Parameters.AddWithValue("@fq_whoid", personID);
dbfCmd.Parameters.AddWithValue("@fq_whoprog", whatProgram);
dbfCmd.Parameters.AddWithValue("@param1", name);
dbfCmd.Parameters.AddWithValue("@param2", town);
dbfCmd.Parameters.AddWithValue("@param3", pcode);
dbfCmd.Parameters.AddWithValue("@param4", blank);
dbfCmd.Parameters.AddWithValue("@param5", blank);
dbfCmd.Parameters.AddWithValue("@param6", blank);
dbfCmd.Parameters.AddWithValue("@param7", blank);
dbfCmd.Parameters.AddWithValue("@param8", blank);
dbfCmd.Parameters.AddWithValue("@param9", blank);
dbfCmd.Parameters.AddWithValue("@param10", blank);
dbfCmd.Parameters.AddWithValue("@param11", blank);
dbfCmd.Parameters.AddWithValue("@param12", blank);
dbfCmd.Parameters.AddWithValue("@param13", blank);
dbfCmd.Parameters.AddWithValue("@paraml1", blank);
dbfCmd.Parameters.AddWithValue("@paraml2", blank);
dbfCmd.ExecuteNonQuery();
return true;
}
}
catch (OleDbException ex)
{
MessageBox.Show("Error Updating MySQL: " + ex);
return false;
}
}
我想要的是,发送到 DBF 的参数数量取决于用户为公司填写的字段数量,例如,如果他们只填写姓名、城镇和 post 代码那么 SendToDBF 将采用 3 params
以及预定义参数,例如 ID
、Whatfile
和 QueryType
.
有什么方法可以让 SendToDBF 接受一个未指定数量的参数,并用空白填充其余用户没有输入的参数?
您可以使用 params
:
public bool SendToDBF(params string[] parameters)
{
}
public bool SendToDBF(params object[] parameters)
{
}
如果类型总是 string
你可以使用 params
keyword in C#:
public static void TestParams(params string[] Params)
{
foreach (string param in Params)
{
Console.WriteLine(param);
}
}
然后根据Params
示例:
public static void TestParams(params string[] Params)
{
// init dbf up here
int maxParams = 12;
for(int i = 1; i <= maxParams; i++)
{
string paramName = "@param" + i;
if(Params.Length >= i)
dbfCmd.Parameters.AddWithValue(paramName, Params[i - 1]); // array index is zero-based
else
dbfCmd.Parameters.AddWithValue(paramName, blank);
}
}
我不知道你的问题的确切上下文,但你可以:
- 将您的参数列表转换为具有键/值的字典(字典或字典),这样您就可以将准确的参数传递给您的方法,这样您就不会混淆每个参数的顺序。
所以你会有一个
new Dictionary<string, string> { {"firstName": "John"}, {"age": "42"} }
对于其余的参数,有一个带有键的数组,您可以在其中比较并用空白填充剩余的(我猜您的程序需要所有参数)
或另一种选择:使用包含所有参数的默认字典,每列都有默认值:
new Dictionary<string, string> { "status": "1" }
然后您只需将默认值与参数合并,然后将所有键和值添加到命令中。
参见:Merging dictionaries in C#
- 如果参数的顺序不重要(我对此表示怀疑),您可以使用 params 关键字。请参阅 Why use the params keyword? 了解何时使用。
我会建立一个字段名称和值的字典,并自己构建 SQL。您可以从方法中传入字典,也可以在内部构建它。
Dictionary<string, object> d = new Dictionary<string, object>();
d["personID"] = 1234;
// ...
SQL可以这样构建:
StringBuilder sb = new StringBuilder();
sb.Append("insert into ");
sb.Append(tableName);
sb.Append(" (");
StringBuilder sbValues = new StringBuilder();
sbValues.Append("values (");
bool first = true;
foreach (KeyValuePair<string, object> kvp in d)
{
if (first)
{
first = false;
}
else
{
sb.Append(", ");
sbValues.Append(", ");
}
sb.Append(kvp.Key);
sbValues.Append("?");
// put the value in a SQL parameter;
dbfCmd.Parameters.AddWithValue("@" + kvp.Key, kvp.Value);
}
sb.Append(") ");
sbValues.Append(")");
sb.Append(sbValues.ToString());
string fullSql = sb.ToString();
它将构建值字符串和 SQL 语句的其余部分分开,因为您还需要遍历集合两次,这似乎没有必要。