如何使用.net在impala数据库odbc连接中插入超过5列?

gr8qqesn  于 2023-03-09  发布在  .NET
关注(0)|答案(1)|浏览(166)

我正在尝试为五列插入以下代码:

List<string> ReadFile = File.ReadAllLines(@"D:\Data.txt").ToList();

var cmdText = "INSERT INTO TEST Values (@name, @panno,@city,@Pin,@mobilenumber)";
OdbcCommand cmd = new OdbcCommand(cmdText, Conn);
Conn.Open();

foreach(var col in Readfile)
{
    cmd.Parameters["@name"].Value = ReadFile[i].Split(new string[] { "," }, StringSplitOptions.None)[0]; 
    cmd.Parameters["@panno"].Value = ReadFile[i].Split(new string[] { "," }, StringSplitOptions.None)[1]; 
    cmd.Parameters["@city"].Value = ReadFile[i].Split(new string[] { "," }, StringSplitOptions.None)[2]; 
    cmd.Parameters["@Pin"].Value = ReadFile[i].Split(new string[] { "," }, StringSplitOptions.None)[3]; 
    cmd.Parameters["@mobilenumber"].Value = ReadFile[i].Split(new string[] { "," }, StringSplitOptions.None)[4];
    cmd.CommandTimeout = 0;
    cmd.ExecuteNonQuery();
    i++;

}
  Conn.Close();

我希望以上代码更有效和更快的超过50列和超过100万行插入一次在impala表,使用odbc连接。

ajsxfq5m

ajsxfq5m1#

如果考虑一些简单的东西,代码会变得简单得多:
1.最佳做法:使用using进行连接,以确保它不会泄漏。
1.更好的命名:ReadFile不好。lines更好,也许csvLines更好。局部变量使用小写。
1.不要重复自己(干):不要经常拆分。拆分一次,然后重用结果。

  1. ReadFile[i]col相同。请改用col
    1.更好的命名:col不是一个好名字,因为我假设它的意思是 column,但它不是一列,而是一行,这在修改2中变得更加明显。
    我想以上的一切都把你自己搞糊涂了。
    之后,您的代码如下所示:
List<string> csvLines = File.ReadAllLines(@"D:\Data.txt").ToList();

var cmdText = "INSERT INTO TEST Values (@name, @panno,@city,@Pin,@mobilenumber)";
OdbcCommand cmd = new OdbcCommand(cmdText, conn);
using (conn.Open()) // or similar, depending on your database
{  

    foreach(var line in csvLines)
    {
        var columns = line.Split(new string[] { "," }, StringSplitOptions.None);
        cmd.Parameters["@name"].Value = columns[0]; 
        cmd.Parameters["@panno"].Value = columns[1]; 
        cmd.Parameters["@city"].Value = columns[2]; 
        cmd.Parameters["@Pin"].Value = columns[3]; 
        cmd.Parameters["@mobilenumber"].Value = columns[4]; 
        cmd.CommandTimeout = 0;
        cmd.ExecuteNonQuery();
    }

} // connection will be closed here

接下来你能做什么?
1.您可以在列表中的某个位置定义所有列名

List<string> columnNames = new List<string>{"name", "panno", "city", "Pin", "mobilenumber"};

1.再次减少重复:现在可以循环遍历列名并在循环中添加所有参数:

int columnIndex = 0;
foreach (var columneName in columnNames)
{
    cmd.Parameters["@"+columnName] = columns[columnIndex];
}

1.不要一次插入一行,而是将它们分组为更大的数量,例如100次插入。

相关问题