【问题标题】:sqlBulk insert C#sql批量插入C#
【发布时间】:2014-04-25 14:19:29
【问题描述】:

我有一个页面,我想将 CSV 文件从我的计算机上传到服务器上的数据库,并且我的 opentext 如下所示

using (StreamReader sr = File.OpenText(@"c:\users\workstationUsername\FileName.csv"))

这在我的本地机器上运行良好,但是当我将它推送到服务器时,它会尝试读取服务器的 C 驱动器,我希望它读取位于用户计算机桌面上的物理文件位置,而不是服务器,当他们点击浏览和上传.. 谢谢

下面是完整的代码:

if (IsPostBack)
{

   // SetDefaultDates();
   Boolean fileOK = false;
   String dateString = DateTime.Now.ToString("MMddyyyy");
   String UserName = User.Identity.Name;
   String path = Server.MapPath("~/Uploads/CSVs/");

   string stringpath = Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory);

   String fileName = System.IO.Path.GetFileName(FileUpload1.PostedFile.FileName);
   stringpath = stringpath + fileName; 
   String LocationToSave = path + "\\" + fileName;
   if (FileUpload1.HasFile)
   {
       String fileExtension =
                System.IO.Path.GetExtension(FileUpload1.FileName).ToLower();
       String[] allowedExtensions = { ".csv" };
       for (int i = 0; i < allowedExtensions.Length; i++)
       {
           if (fileExtension == allowedExtensions[i])
           {
               fileOK = true;
           }
       }
   }

   if (fileOK)
   {
       try
       {
           //FileUpload1.PostedFile.SaveAs(LocationToSave + dateString + "-" + FileUpload1.FileName);
           FileUpload1.PostedFile.SaveAs(LocationToSave);
           Label1.Text = "File " + FileUpload1.FileName + " uploaded!";

           DataTable dt = new DataTable();
           string line = null;
           int i = 0;

           using (StreamReader sr = File.OpenText(stringpath)) 
           {
               while ((line = sr.ReadLine()) != null)
               {
                   string[] data = line.Split(',');
                   if (data.Length > 0)
                   {
                       if (i == 0)
                       {
                           foreach (var item in data)
                           {
                               dt.Columns.Add(new DataColumn());
                           }
                           i++;
                       }
                       DataRow row = dt.NewRow();
                       row.ItemArray = data;
                       dt.Rows.Add(row);
                   }
               }
           }

           using (SqlConnection cn = new SqlConnection(ConfigurationManager.ConnectionStrings["Myconnection"].ConnectionString))
           {
               cn.Open();
               using (SqlBulkCopy copy = new SqlBulkCopy(cn))
               {
                   copy.WriteToServer(dt);
               }
           }
       }
       catch (Exception ex)
       {
           Label1.Text = "File " + FileUpload1.FileName + " could not be uploaded." + ex.Message;
       }
   }
   else
   {
       Label1.Text = "Cannot accept files of this type. " + FileUpload1.FileName;
   }
}
SetDefaultDates();
}

【问题讨论】:

  • 你的申请是什么?是客户端-服务器应用程序(可能是 Web 应用程序)还是什么?

标签: c# csv sqlbulkcopy


【解决方案1】:

如果您有 FileUpload 控件,那么您可以这样做:

(StreamReader sr = new StreamReader(fileUploadControl.FileContent))
    //Do your stuff

【讨论】:

    【解决方案2】:

    您无法访问客户端的硬盘。这是一个主要的安全问题。您需要将文件上传到服务器,然后从那里读取。

    【讨论】:

    • 您不理解我的问题,或者我没有说清楚,我没有尝试访问客户端的硬盘驱动器,但这就是我使用以下字符串 stringpath = Environment.GetFolderPath 时尝试做的事情(Environment.SpecialFolder.DesktopDirectory)
    • 那么我仍然不清楚您对“我希望它读取位于用户计算机桌面上的物理文件位置而不是服务器上的物理文件位置”的含义。您不能在代码中硬编码文件路径。您需要将文件上传到您的服务器才能访问它。查看古斯曼的答案,因为这应该是您所需要的。
    • 我刚刚发布了我拥有的完整代码,以便您了解我想要解释的内容。对不起,如果我另有解释。
    【解决方案3】:

    对本地机器进行静态读取是没有意义的,而是让用户上传然后更新数据库,这种代码非常有限并且具有很高的安全风险。而是创建一个 steamreader 对象让用户上传它,然后使用 steam reader 来处理 csv。

    【讨论】:

    • 这只是一个例子,我正在做你上面描述的事情,但问题是当我将它推送到服务器时,它会尝试读取我不希望它做的服务器文件位置
    猜你喜欢
    • 1970-01-01
    • 2013-09-21
    • 2010-09-24
    • 2016-01-31
    • 2013-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多