带有大量参数的C#SQL插入

时间:2014-04-07 13:01:40

标签: c# sql odbc

我有几天的问题,似乎没有在网上做任何事情。

我有一个包含150列的SQL表。我正在从ODBC连接读取数据,我想将该数据插入SQL表。基本上将ODBC表复制为SQL。

我的问题是,如果我将所有内容都放在一个字符串中并插入它,那么我将面临一个带有转义字符和异常的地狱,我无法弄明白。

有没有办法对我的插入值进行参数化,而不会让我分别为它们命名。

这就是我现在所拥有的。此外,如果有人知道将ODBC表移动到SQL表单的更简单方法,请告诉我

private void fillTable(string tableName)
    {

        String query = "SELECT * FROM " + tableName;
        OdbcCommand command = new OdbcCommand(query, Program.myConnection);
        OdbcDataReader reader = command.ExecuteReader(CommandBehavior.SequentialAccess);

        int columnCount = reader.FieldCount;
        for (int i = 0; i < columnCount; i++)
        {
            SqlCommand sCommand = new SqlCommand("ALTER TABLE " + tableName + " ADD " + reader.GetName(i) + " varchar(MAX)", Program.myConnection2);
            sCommand.ExecuteNonQuery();
        }

        string row="";
        while (!reader.IsClosed)
        {
            try
            {
                row = "";
                reader.Read();
                for (int i = 0; i < columnCount; i++)
                {
                    if (reader != null)
                    {
                            if (reader.GetString(i).Contains('\''))
                            {
                                Console.WriteLine("REPLACED QUOT");
                                String s = reader.GetString(i).Replace("\'", "A");
                                Console.WriteLine(s);
                                row += s;
                            }
                            else
                            {
                                row += "\'" + reader.GetString(i).Trim() + "\',";
                            }

                       // Console.WriteLine("FILLER: " + reader.GetString(i));
                    }
                    //Console.WriteLine(row);
                }
                //Console.WriteLine();
                row = row.Substring(0, row.Length - 1);
                SqlCommand insertCommand = new SqlCommand("INSERT INTO " + tableName  + " VALUES(\'1\'," + row + ")", Program.myConnection2);
                insertCommand.ExecuteNonQuery();
            }
            catch (SqlException exp)
            {
                Console.WriteLine(exp.StackTrace);
                Console.WriteLine(row);
               // this.Close();
            }
        }
        Program.myConnection2.Close();
    }

1 个答案:

答案 0 :(得分:1)

您可以编写一个自动创建参数名称的方法,将其添加到命令中,并返回名称,以便您可以在查询中使用它:

private int _paramCounter = 1;

private string CreateParameter(SqlCommand command, object value) {
  string name = "@P" + _paramCounter.ToString();
  _paramCounter++;
  command.Parameters.AddWithValue(name, value);
  return name;
}

用法:

row += CreateParameter(insertCommand, reader.GetString(i).Trim()) + ",";

请注意,您需要在遍历列之前创建命令对象。此外,虽然不需要,但您可能希望为每行重置_paramCounter,否则参数名称最终会更长。