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

问题描述 投票:0回答:1

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

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();

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

c# .net odbc impala
1个回答
0
投票

如果你考虑一些简单的东西,你的代码会变得更简单:

  1. 最佳实践:使用
    using
    进行连接以确保它不会泄漏。
  2. 更好的命名:
    ReadFile
    不好。
    lines
    更好,也许
    csvLines
    更好。对局部变量使用小写。
  3. Don't repeat yourself (DRY):不要经常拆分。拆分一次并重复使用结果。
  4. ReadFile[i]
    等同于
    col
    。使用
    col
    代替。
  5. 更好的命名:
    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 个插入物。
© www.soinside.com 2019 - 2024. All rights reserved.