我有几天的问题,似乎没有在网上做任何事情。
我有一个包含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();
}
答案 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
,否则参数名称最终会更长。