【问题标题】:Paramaterize File Name in SQL LOAD DATA FILE Statement在 SQL LOAD DATA INFILE 语句中参数化文件名
【发布时间】:2012-09-24 23:12:08
【问题描述】:

我正在尝试将 CSV 文件放入 MySQL 表中,请参阅此线程:

Loading CSV into MySQL Is This a Bug? - File Not Found Exception

我发现由于文件名中的双重反冲,执行命令会引发异常。如果我将 CSV 文件移动到可执行文件所在的位置并且只提供文件名,它运行得很好。问题是 LOAD DATA 语句只接受文件名的字符串,根据 MySQL 文档。我无法传递参数,也不知道如何在 C# 中指定字符串中的 '\' 而不先转义它。我正在使用 String.Format() 来构建命令字符串。我已经尝试过 String.Format(@"") 和没有@,两者都不起作用。有人有建议吗?我搜索了论坛,找到了一个 PHP 的例子,想知道是否有 C# 的东西。

这是我现在拥有的代码,其中 InputFileListView 是用户选择加载到数据库中的文件列表。问题是访问文件路径信息的任何 ToString() 方法都将 \ 放在字符串中。这会导致执行命令出现问题

IEnumerable<FileInfo> files = this.InputFileListView.Items.Cast<FileInfo>();

 // just using the first entry in InputFileListView for now
string working = String.Format("LOAD DATA LOCAL INFILE '{0}' IGNORE", files.FirstOrDefault().ToString()) +
                         String.Format("INTO TABLE {0} COLUMNS TERMINATED BY ',' LINES TERMINATED BY '\n'", "by_switch")+
                         String.Format("IGNORE 1 LINES (`Switch`,`Port`,`WWPN`,@the_slot,`Port Index`,@the_time,`Interval`,`Port Send Packet Rate`,")+
                         String.Format("`Port Receive Packet Rate`,`Total Port Packet Rate`,`Port Send Data Rate`,")+        
                         String.Format("`Port Receive Data Rate`,`Total Port Data Rate`,`Port Peak Send Data Rate`,`Port Peak Receive Data Rate`,")+ 
                         String.Format("`Port Send Packet Size`,`Port Receive Packet Size`,`Overall Port Packet Size`,`Error Frame Rate`,")+
                         String.Format("`Dumped Frame Rate`,`Link Failure Rate`,`Loss of Sync Rate`,`Loss of Signal Rate`,`CRC Error Rate`,")+
                         String.Format(" `Short Frame Rate`,`Long Frame Rate`,`Encoding Disparity Error Rate`,")+         
                         String.Format("`Discarded Class3 Frame Rate`,`F-BSY Frame Rate`,`F-RJT Frame Rate`, `Port Send Bandwidth Percentage`,")+
                         String.Format("`Port Receive Bandwidth Percentage`, Overall Port Bandwidth Percentage`,`Primitive Sequence Protocol Error Rate`,")+
                         String.Format("`Invalid Transmission Word Rate`,`Link Reset Transmitted Rate`,`Link Reset Received Rate`)")+ 
                          String.Format("SET Slot = nullif(@the_slot,''),")+ 
                          String.Format(@"Time= str_to_date(@the_time,'%m/%d/%y %h:%i %p')");

我试过了,还是不行。

  string tester = files.FirstOrDefault().Directory.ToString();
        tester = tester.Replace(@"\\", @"\");

【问题讨论】:

    标签: c# mysql


    【解决方案1】:

    好吧,我没有找到问题的答案,但我找到了解决方法。我想使用 BulkLoader 做的工作:

    var bl = new MySqlBulkLoader(sqlconnect);
          bl.TableName = "by_switch";
          bl.FieldTerminator = ",";
         bl.LineTerminator = "\n";
          bl.FileName = files.FirstOrDefault().ToString();
           bl.NumberOfLinesToSkip = 1;
        int inserted = bl.Load();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-21
      相关资源
      最近更新 更多