我一直在通过ODBC查询和从Impala插入数据,但是速度很慢(至少与Postgres或SQL Server相比),并且ODBC驱动程序使得可以逐个执行查询,因此绝对不建议这样做每次插入都会在HDFS中创建一个新文件。
我通读了Simba网站和Cloudera网站上提供的ODBC文档,但未提及批处理操作或直接执行SQL。
这是我到目前为止尝试过的代码
static void Main(string[] args)
{
string insert = $"INSERT INTO tbl(version, snapshot) " +
$"VALUES(?, ?)";
OdbcConnection connection = new OdbcConnection("DSN=connection");
connection.Open();
using (OdbcCommand insertCommand = new OdbcCommand(insert, connection))
{
for (int i = 10; i < 15; i++)
{
List<OdbcParameter> parameters = new List<OdbcParameter>();
OdbcParameter versionParam = new OdbcParameter("@version", OdbcType.Text);
versionParam.Value = "bla" + i;
parameters.Add(versionParam);
OdbcParameter snapshotParam = new OdbcParameter("@snapshot", OdbcType.Text);
snapshotParam.Value = "blabla" + i;
parameters.Add(snapshotParam);
insertCommand.Parameters.AddRange(parameters.ToArray());
}
string query = insertCommand.CommandText.ToString();
Console.WriteLine(query);
//insertCommand.ExecuteReader();
insertCommand.ExecuteNonQuery();
}
}
插入一行,但是应该插入5行。我在做什么错了?
答案 0 :(得分:1)
.ExecuteNonQuery()
调用需要在内部 for (....)
循环中……..另一方面,用于 create 的代码参数必须位于for ()
循环的外部 -在循环内部,您应该仅 设置参数的值-不要一直重新创建他们一遍又一遍....
尝试以下代码:
static void Main(string[] args)
{
string insert = $"INSERT INTO tbl(version, snapshot) VALUES(?, ?)";
OdbcConnection connection = new OdbcConnection("DSN=connection");
connection.Open();
using (OdbcCommand insertCommand = new OdbcCommand(insert, connection))
{
// *create* the parameters *outside* the "for" loop - only once!
List<OdbcParameter> parameters = new List<OdbcParameter>();
OdbcParameter versionParam = new OdbcParameter("@version", OdbcType.Text);
parameters.Add(versionParam);
OdbcParameter snapshotParam = new OdbcParameter("@snapshot", OdbcType.Text);
parameters.Add(snapshotParam);
insertCommand.Parameters.AddRange(parameters.ToArray());
for (int i = 10; i < 15; i++)
{
// inside the "for" loop - only set the values of the parameters
versionParam.Value = "bla" + i;
snapshotParam.Value = "blabla" + i;
// ... and then *execute* the query to run the insert!
string query = insertCommand.CommandText.ToString();
Console.WriteLine(query);
insertCommand.ExecuteNonQuery();
}
}
}