65.9K
CodeProject 正在变化。 阅读更多。
Home

读取在线 CSV 文件并将其管理到 Microsoft SQL 数据库

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.38/5 (12投票s)

2011 年 3 月 28 日

CPOL

2分钟阅读

viewsIcon

57016

downloadIcon

900

如何读取在线 Excel 文件并将其管理到 Microsoft SQL 数据库。

引言

对于长时间工作的软件开发者来说,可能需要从桌面或 Web 应用程序读取在线文件,然后将数据存储在本地系统或数据库中。 如果您没有这方面的经验,这会有些复杂。 您可以通过多种方式实现它。 在本次演示中,我将根据我的经验来解释如何处理这种情况。

背景

我有一个在线 Excel 文件,URL 是 http://velocitypath.com/odesk/buildings.csv。 我需要读取此文件并将其管理到 Microsoft SQL Server 数据库中。 Excel 文件的结构如下所示

图 1

开始吧

要将数据从 Excel 文件存储到数据库,需要在 Microsoft SQL Server 数据库中创建表结构。

  • 打开 Microsoft SQL Server Management Studio
  • 创建如下表结构

图 2

打开 Microsoft Visual Studio 2010

  • 创建一个新项目(文件>新建>项目>Visual C#>Windows 窗体应用程序
  • 将其命名为 ReadingOnlineExcelFile

图 3

默认情况下,新项目包含一个名为 ReadExcel.cs 的窗体。 像下面这样设计窗体

图 4

要读取在线文件,需要发送 Web 请求。 成功处理 Web 请求后,Web 服务器将返回 Web 响应。 为了完成此操作,您需要使用 HttpWebRequestHttpWebResponse 类。 并且使用 WebRequest 类来创建 Web 请求。 这些类都可以在 System.Net 命名空间中找到。

using System.Net;

现在,创建一个方法来处理 Web 请求并获取计数器响应。 我们的目标是将 StreamReader 对象作为此方法的返回值。 因此,您需要包含

using System.IO;
#region Method

private StreamReader GetStream()
        {
            String strURL = String.Empty;
            strURL = "http://velocitypath.com/odesk/buildings.csv";

            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(strURL);

            StreamReader reader;

            using (HttpWebResponse response =(HttpWebResponse)request.GetResponse())
            {
                reader = new StreamReader(response.GetResponseStream());
            }

            return reader;
        }

#endregion Method

在上面的方法中,WebRequest.Create() 用于创建 Web 请求,要获取 Web 请求的响应 GetResponse(),要读取 Web 响应中的 stream,使用 GetResponseStream()

添加 System.Configuration 引用

图 5

添加以下命名空间用于数据和 SQL 操作。

using System.Data;
using System.Configuration;
using System.Data.SqlClient;

在按钮单击事件中添加以下代码

private void btnReadExcel_Click(object sender, EventArgs e)
        {
            using (SqlConnection conn = new SqlConnection
            (ConfigurationManager.ConnectionStrings["SQLConnection"].ToString()))
            {
                conn.Open();

                StreamReader streamReader;

                streamReader = GetStream();

                streamReader.ReadLine();
                while (!streamReader.EndOfStream)
                {
                    String []row = streamReader.ReadLine().ToString().Split(',');

                    SqlCommand selectCommand;
                    selectCommand = new SqlCommand("SELECT * FROM Location
                    WHERE Latitude=@Latitude AND Longitude=@Longitude", conn);

                    selectCommand.Parameters.Add("@Latitude",
                    SqlDbType.Decimal, 20).Value = Convert.ToDecimal(row[0]);
                    selectCommand.Parameters.Add("@Longitude",
                    SqlDbType.Decimal, 20).Value = Convert.ToDecimal(row[1]);

                    SqlDataReader reader = selectCommand.ExecuteReader();

                    if (!reader.HasRows)
                    {
                        reader.Close();

                        SqlCommand insertCommand;
                        insertCommand = new SqlCommand("INSERT INTO Location
                        (Latitude,Longitude,BuildingName)
                        VALUES(@Latitude,@Longitude,@BuildingName)", conn);

                        insertCommand.Parameters.Add("@Latitude",
                        SqlDbType.Decimal, 20).Value = Convert.ToDecimal(row[0]);
                        insertCommand.Parameters.Add("@Longitude",
                        SqlDbType.Decimal, 20).Value = Convert.ToDecimal(row[1]);
                        insertCommand.Parameters.Add("@BuildingName",
                        SqlDbType.VarChar, 100).Value = row[2].ToString();

                        int intResult;
                        intResult = insertCommand.ExecuteNonQuery();
                    }
                }
            }
        }

在上面的代码中,以下 GetStream() 从 Web 请求返回 Stream

  streamReader = GetStream();
  streamReader.ReadLine();

上面的代码行从 stream 中读取一行。

图 6

stream 中的行添加到数组中以便于操作。

String []row = streamReader.ReadLine().ToString().Split(',');

图 7

现在检查数据是否已存在于数据库中。

SqlCommand selectCommand;
selectCommand = new SqlCommand
     ("SELECT * FROM Location WHERE Latitude=@Latitude AND Longitude=@Longitude", conn);

     selectCommand.Parameters.Add("@Latitude",
     SqlDbType.Decimal, 20).Value = Convert.ToDecimal(row[0]);
     selectCommand.Parameters.Add("@Longitude",
     SqlDbType.Decimal, 20).Value = Convert.ToDecimal(row[1]);

     SqlDataReader reader = selectCommand.ExecuteReader();

     if (!reader.HasRows)
     {
     }

如果不存在,则将数据插入数据库。

reader.Close();

SqlCommand insertCommand;
insertCommand = new SqlCommand("INSERT INTO Location
                (Latitude,Longitude,BuildingName) VALUES
                (@Latitude,@Longitude,@BuildingName)", conn);

insertCommand.Parameters.Add("@Latitude",
SqlDbType.Decimal, 20).Value = Convert.ToDecimal(row[0]);
insertCommand.Parameters.Add("@Longitude",
SqlDbType.Decimal, 20).Value = Convert.ToDecimal(row[1]);
insertCommand.Parameters.Add("@BuildingName",
SqlDbType.VarChar, 100).Value = row[2].ToString();

int intResult;
intResult = insertCommand.ExecuteNonQuery();

这是数据库中的结果

图 8

结论

通过阅读本文,您可以创建自己的在线文件读取应用程序。 我认为这可能会在软件开发和专业工作中帮助您。

历史

  • 2011 年 3 月 28 日:初始发布
© . All rights reserved.