向方法发送未指定数量的参数

时间:2015-10-26 14:47:47

标签: c# methods oledb foxpro

我有一个程序,此刻被硬编码以发送用户输入到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的参数数量取决于用户为公司填写的字段数,例如,如果他们只填写姓名,城镇和邮政编码,那么SendToDBF将需要3 { {1}}以及预定义参数,例如paramsIDWhatfile

有没有一种方法可以让SendToDBF获取一个未指定数量的参数,并用空白填写其余未被用户投入的其他参数?

4 个答案:

答案 0 :(得分:3)

如果类型始终为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);
    }
}

答案 1 :(得分:3)

我不知道您问题的确切背景,但您可以:

  1. 将参数列表转换为带有键/值(字典或词典)的字典,这样您就可以将精确参数传递给方法,这样就不会按每个参数的顺序混淆。
  2. 所以你会有一个

    new Dictionary<string, string> { {"firstName": "John"}, {"age": "42"} }
    

    并且对于其余的参数,有一个带有键的数组,你可以在其上区分并填充剩余的空白(我猜你的程序需要所有的参数)

    或其他替代方法:使用包含所有参数的默认字典,每个列具有默认值:

    new Dictionary<string, string> { "status": "1" }
    

    然后,您只需将默认值与参数合并,然后将所有键和值添加到命令中。

    请参阅:Merging dictionaries in C#

    1. 如果订单对参数不重要(我怀疑),您可以使用params关键字。有关何时使用,请参阅Why use the params keyword?

答案 2 :(得分:0)

您可以使用params

public bool SendToDBF(params  string[] parameters)
{

}

public bool SendToDBF(params  object[] parameters)
{

}

答案 3 :(得分:0)

我会构建一个字段名称和值的字典,并自己构建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语句的其余部分,因为你需要两次检查集合,这似乎是不必要的。