IT-例子 2024-02-05 10:34 采纳率: 0%
浏览 2

C#入库CSV文件有的字段变小数

这个入库CSV文件时会把这个数据的文件中的remoteIp这个字段内容
117.182.220.34看成是一个小数;然后入库数据就变成了这个117.1822;我应该如何解决这个问题呢;而且我的入库文件列数与数据库设计字段数是一样的;现在就是不知道怎么搞这个入库CSV文件数据变成小数问题;请各位懂得技术人支下招;非常感谢。

private void NODLimport(string tablename, string datebasename, string buttonname)
        {

            string xxx = "";
            string Tag = "";
            string connString = "server=192.0.0.1;uid=sa;pwd=xyz@1230;database=" + datebasename;
            System.Windows.Forms.OpenFileDialog fd = new OpenFileDialog();
            fd.Multiselect = true;
            if (fd.ShowDialog() == DialogResult.OK)
            {

                foreach (string file in fd.FileNames)
                {
                    xxx += file + "\n";

                }
                DialogResult dr = MessageBox.Show("是否将以下文件导入到【" + buttonname + "】\n" + xxx, "导入文件确认", MessageBoxButtons.OKCancel, MessageBoxIcon.Question);
                if (dr == DialogResult.OK)
                {
                    //label1.Visible = true;
                    richTextBox1.Text = null;
                    richTextBox2.Text = null;


                    foreach (string file in fd.FileNames)
                    {

                        richTextBox2.AppendText(DateTime.Now.ToString("HH:mm:ss  ") + System.IO.Path.GetFileName(file) + "数据读取中...\n");
                        Tag = TransferData(file, tablename, connString);

                        richTextBox2.AppendText("--------------------\n");
                        richTextBox1.ScrollToCaret();
                        richTextBox2.ScrollToCaret();


                    }

                    if (Tag == "TAG") { MessageBox.Show("导入完成!"); }
                    else MessageBox.Show("导入失败!");

                }

            }
        }
        
        public string TransferData(string excelFile, string tablename, string connectionString)
        {


            DataSet ds = new DataSet();
            // int yichang = 0;  //异常标记

            try
            {

                String codename = FileEncoding.EncodingType.GetFileEncodeType(excelFile).CodePage.ToString();
                string fileName = excelFile.Remove(0, excelFile.LastIndexOf("\\") + 1);
                string strConn = null;
                string strExcel = "";
                OleDbDataAdapter myCommand = null;
                switch (fileName.Split('.').Last())
                {
                    case "xls":
                        strConn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + excelFile + ";Extended Properties='Excel 12.0;HDR=YES;IMEX=1'";
                        break;
                    case "xlsx":
                        strConn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + excelFile + ";Extended Properties='Excel 12.0;HDR=YES;IMEX=1'";
                        break;
                    default:
                        strConn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + excelFile.Remove(excelFile.LastIndexOf("\\") + 1) + ";Extended Properties='text;HDR=YES;FMT=Delimited;CharacterSet=" + codename + ";';";
                        strExcel = "select * from  " + fileName;
                        break;
                }

                //获取全部数据  

                // string strConn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + excelFile + ";Extended Properties='Excel 12.0;HDR=YES;IMEX=1'";
                //string strConn = string.Format(@"Provider=Microsoft.Ace.OLEDB.12.0;Data Source={0};Extended Properties='Text;'", AppDomain.CurrentDomain.BaseDirectory);

                // string strConn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + excelFile + ";Extended Properties='TEXT;HDR=Yes;FMT=Delimited;'"; // csv file:HDR=Yes-- first line is header 


                OleDbConnection conn = new OleDbConnection(strConn);
                conn.Open();
                DataTable dt = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);

                string sheetName = dt.Rows[0][2].ToString().Trim();


                if (strExcel == "")
                {
                    if (tablename == "TS_MYD_2019")
                        strExcel = string.Format("select * from [{0}A3:CE1048576]", sheetName);
                    else strExcel = string.Format("select * from [{0}]", sheetName);
                }
                conn.Close();
                myCommand = new OleDbDataAdapter(strExcel, strConn);
                myCommand.Fill(ds, sheetName);

                myCommand.Dispose(); //关闭对象

                int rowsnum = ds.Tables[0].Rows.Count;
                progressBar1.Maximum = rowsnum;//设置进度条的最大值为总条数

                using (System.Data.SqlClient.SqlBulkCopy bcp = new System.Data.SqlClient.SqlBulkCopy(connectionString))
                {
                    bcp.BulkCopyTimeout = 666666666;
                    bcp.SqlRowsCopied += new System.Data.SqlClient.SqlRowsCopiedEventHandler(bcp_SqlRowsCopied);
                    bcp.BatchSize = 100;//每次传输的行数  
                    bcp.NotifyAfter = 100;//进度提示的行数  
                    bcp.DestinationTableName = tablename;//目标表  
                    bcp.WriteToServer(ds.Tables[0]);
                    bcp.Close();//关闭对象
                }
                using (System.Data.SqlClient.SqlConnection sqlconn = new System.Data.SqlClient.SqlConnection(connectionString))
                {
                    string luanlai = "";
                    sqlconn.Open();

                    System.Data.SqlClient.SqlCommand command = sqlconn.CreateCommand();
                    command.CommandTimeout = 6000; //设置相应时间
                    if (tablename == "TS_MYD_2019")
                    {
                        command.CommandText = "EXECUTE   pro_update_ts_myd; ";
                        command.ExecuteNonQuery();
                        luanlai = "存储过程已执行!";
                    }

                    sqlconn.Close();
                    richTextBox1.SelectionColor = Color.Blue; richTextBox1.AppendText(System.IO.Path.GetFileName(excelFile) + "导入完成!!!!\n" + luanlai + "\n");
                    return "TAG"; //返回结果控制弹窗
                }


            }
            catch (Exception ex)
            {
                System.Windows.Forms.MessageBox.Show(ex.Message);
                richTextBox1.SelectionColor = Color.Red;
                richTextBox1.AppendText(System.IO.Path.GetFileName(excelFile) + "导入失败!!!!" + "\n");
                richTextBox2.SelectionColor = Color.Red;
                richTextBox2.AppendText(DateTime.Now.ToString("HH:mm:ss  ") + "导入异常" + "\n");
                if (ex.Message == "给定的 ColumnMapping 与源或目标中的任意列均不匹配。")
                {
                    richTextBox1.AppendText("详细失败原因如下:导入的EXCEL的单元格列数比设定的列数多,请检查EXCEL的数据是否异常\n");
                }
                else richTextBox1.AppendText("详细失败原因如下:" + ex.Message + "\n");
                Application.DoEvents();//重点,必须加上,否则父子窗体都假死


                return "";//返回结果控制弹窗


            }

        }
        private void btn_csvtest_Click(object sender, EventArgs e)
        {
            NODLimport("CSV_TEST", "RBZZY", "CSV_TEST临时增量导入" + this.btn_csvtest.Text);
        }
  • 写回答

2条回答 默认 最新

  • 专家-郭老师 Java领域新星创作者 2024-02-05 10:38
    关注

    参考通义千问和郭老师的小迷弟雅思莫了-编写提供,主要是为了帮助您快速解决问题,如下回答,您可以参考下,如有问题,评论区留言。

    从您提供的代码来看,问题可能出在SqlBulkCopy将CSV文件数据读取为小数时无法正确识别IP地址字段。由于CSV文件中的IP地址(如117.182.220.34)在某些情况下会被默认解析为数值类型,从而导致了数据截断。

    要解决这个问题,你需要确保在进行SqlBulkCopy操作之前,正确地将IP地址字段转换为字符串类型,而不是让OleDbDataAdapter自动识别其数据类型。对于CSV文件的读取,可以自定义列的数据类型映射。

    这里是一个大致的解决方案:

    1. 在读取CSV文件后,遍历数据表每一行,找到remoteIp这一列,并将其值强制转换为字符串类型。
    foreach (DataRow row in ds.Tables[0].Rows)
    {
        row["remoteIp"] = row["remoteIp"].ToString();
    }
    
    1. 或者,在创建OleDbDataAdapter填充DataSet时,指定一个Schema信息,强制将remoteIp列映射为字符串类型。不过这种方式对CSV文件不适用,因为CSV文件没有预定义的Schema信息。

    2. 如果条件允许,更改CSV文件格式,例如将IP地址用引号括起来,这样在导入时会更倾向于将其识别为文本而非数字。

    总之,关键在于确保在执行bcp.WriteToServer(ds.Tables[0])前,CSV文件中IP地址字段已经被明确处理为字符串类型。

    评论

报告相同问题?

问题事件

  • 创建了问题 2月5日

悬赏问题

  • ¥20 python爬虫遇到空文本取不出来
  • ¥15 x264库中预测模式字IPM、运动向量差MVD、量化后的DCT系数的位置
  • ¥15 curl 命令调用正常,程序调用报 java.net.ConnectException: connection refused
  • ¥20 关于web前端如何播放二次加密m3u8视频的问题
  • ¥15 使用百度地图api 位置函数报错?
  • ¥15 metamask如何添加TRON自定义网络
  • ¥66 关于川崎机器人调速问题
  • ¥15 winFrom界面无法打开
  • ¥30 crossover21 ARM64版本安装软件问题
  • ¥15 mymetaobjecthandler没有进入