C# 尝试使用ASP.NET和C将csv和xls文件导入SQL数据库#
我是一名学生,对编程非常陌生,我被指派使用ASP.NET和C#来完成一项任务,而没有人教我。计划是学会自学 我一直在做的一项任务是将网站从CSV或XLS文件导入到一个SQL数据库,该数据库记录了去年校园内的客房预订情况 虽然我通过以下教程学到了一些东西,但我一直在寻找一种方法,通过编程c#将csv文件(用于分隔条目的分隔符为逗号“,”)和xls文件“读取”到使用Microsoft SQL数据库的表中 因此,我所做的是,在下载Visual Studio并开始使用asp.net的webforms之后,我首先在.aspx表单上创建一个按钮,在单击时触发导入:C# 尝试使用ASP.NET和C将csv和xls文件导入SQL数据库#,c#,asp.net,sql,csv,xls,C#,Asp.net,Sql,Csv,Xls,我是一名学生,对编程非常陌生,我被指派使用ASP.NET和C#来完成一项任务,而没有人教我。计划是学会自学 我一直在做的一项任务是将网站从CSV或XLS文件导入到一个SQL数据库,该数据库记录了去年校园内的客房预订情况 虽然我通过以下教程学到了一些东西,但我一直在寻找一种方法,通过编程c#将csv文件(用于分隔条目的分隔符为逗号“,”)和xls文件“读取”到使用Microsoft SQL数据库的表中 因此,我所做的是,在下载Visual Studio并开始使用asp.net的webforms之后
<asp:Button ID="Button1" runat="server" Text="Button" OnClick="Import_button_Click"/>
及
使其读取CSV文件。同时,我创建了一个类,将CSV文件的每个条目存储为变量:
[DelimitedRecord(",")]
public class CSVfile //CSVfile class being defined
{
public int Request_ID;
public int Priority;
public int Module_ID;
public string Day;
public string Start_Time;
public int Length;
public string Park;
public int Students;
public string Room_Code;
public string Status;
public int Semester_ID;
public int Linked_Request;
public int Week_1;
public int Week_2;
public int Week_3;
public int Week_4;
public int Week_5;
public int Week_6;
public int Week_7;
public int Week_8;
public int Week_9;
public int Week_10;
public int Week_11;
public int Week_12;
public int Week_13;
public int Week_14;
public int Week_15;
}
在那之后,就在它读取previousyear.csv的下面,我做了一个循环,它将获取每个条目,并将其放入正确的变量:
DataTable table = new DataTable();
table.Columns.Add(" ", typeof(int));
table.Columns.Add(" ", typeof(int));
table.Columns.Add(" ", typeof(int));
table.Columns.Add(" ", typeof(string));
table.Columns.Add(" ", typeof(string));
table.Columns.Add(" ", typeof(int));
table.Columns.Add(" ", typeof(string));
table.Columns.Add(" ", typeof(int));
table.Columns.Add(" ", typeof(string));
table.Columns.Add(" ", typeof(string));
table.Columns.Add(" ", typeof(int));
table.Columns.Add(" ", typeof(int));
table.Columns.Add(" ", typeof(int));
table.Columns.Add(" ", typeof(int));
table.Columns.Add(" ", typeof(int));
table.Columns.Add(" ", typeof(int));
table.Columns.Add(" ", typeof(int));
table.Columns.Add(" ", typeof(int));
table.Columns.Add(" ", typeof(int));
table.Columns.Add(" ", typeof(int));
table.Columns.Add(" ", typeof(int));
table.Columns.Add(" ", typeof(int));
table.Columns.Add(" ", typeof(int));
table.Columns.Add(" ", typeof(int));
table.Columns.Add(" ", typeof(int));
table.Columns.Add(" ", typeof(int));
table.Columns.Add(" ", typeof(int));
table.Columns.Add(" ", typeof(int));
foreach(结果中的CSVfile行)
{
Console.WriteLine(row.Request\u ID+“”+row.Priority)
但问题是,我不能让它在任何地方输出结果,甚至不能使用gridview
而且,在其他添加了库的计算机上运行它也很麻烦
今天,我的一位队友给了我一段SQL代码,我应该用它将变量放入数据库,如下所示:
更新3:
好的,修复了这段代码。只需将所有代码放在同一行。
现在,我尝试构建应用程序时只有一个错误:
错误3找不到类型或命名空间名称“SqlCommand”(是否缺少using指令或程序集引用?)
因此,SqlCommand无法识别。是否需要添加引用或其他内容才能识别它?
SqlConnection也是如此
更新4
这是我现在正在使用的代码,因为我使它在VisualStudio中工作
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Microsoft.VisualBasic.FileIO;
using System.Data.SqlClient;
namespace ImportPage
{
public class CSVFile
{
public int Request_ID { get; set; }
public int Priority { get; set; }
public int Module_ID { get; set; }
//...
}
public class CSV
{
public string GetConnectionString()
{ return System.Configuration.ConfigurationManager.ConnectionStrings["team03ConnectionString"].ConnectionString; }
protected void button1_Click(object sender, EventArgs e)
{
List<CSVFile> entries = new List<CSVFile>();
using (TextFieldParser parser = new TextFieldParser(@"PreviousYear.csv"))
{
parser.TextFieldType = FieldType.Delimited;
parser.Delimiters = new string[] { "," };
string[] fields;
while (!parser.EndOfData)
{
fields = parser.ReadFields();
entries.Add(new CSVFile()
{
Request_ID = Convert.ToInt32(fields[0]),
Priority = Convert.ToInt32(fields[1]),
Module_ID = Convert.ToInt32(fields[2])
//...
});
}
}
using (SqlConnection conn = new SqlConnection(GetConnectionString()))
{
string sql = "Insert INTO Requests (Priority, Module_ID) OUTPUT INSERTED.Request_ID VALUES (@Priority, @Module_ID)";
try
{
conn.Open();
foreach (CSVFile entry in entries)
{
using (SqlCommand cmd = new SqlCommand(sql, conn))
{
cmd.Parameters.AddWithValue("@Priority", entry.Priority);
cmd.Parameters.AddWithValue("@Module_ID", entry.Module_ID);
// ...
cmd.ExecuteNonQuery();
}
}
}
catch (System.Data.SqlClient.SqlException ex)
{
string msg = "Insert Error:";
msg += ex.Message;
throw new Exception(msg);
}
catch (FormatException ee)
{
System.Web.HttpContext.Current.Response.Write("<SCRIPT LANGUAGE='JavaScript'>alert('Please enter a valid value');</SCRIPT>");
}
catch (System.Exception eeee)
{
System.Web.HttpContext.Current.Response.Write("<SCRIPT LANGUAGE='JavaScript'>alert('System Exception');</SCRIPT>");
}
}
}
}
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用System.Web;
使用System.Web.UI;
使用System.Web.UI.WebControl;
使用Microsoft.VisualBasic.FileIO;
使用System.Data.SqlClient;
名称空间导入页
{
公共类CSVFile
{
公共int请求_ID{get;set;}
公共int优先级{get;set;}
公共int模块_ID{get;set;}
//...
}
公共类CSV
{
公共字符串GetConnectionString()
{返回System.Configuration.ConfigurationManager.ConnectionString[“team03ConnectionString”].ConnectionString;}
受保护的无效按钮1\u单击(对象发送者,事件参数e)
{
列表条目=新列表();
使用(TextFieldParser=newtextfieldparser(@“PreviousYear.csv”))
{
parser.TextFieldType=FieldType.Delimited;
paraser.Delimiters=新字符串[]{“,”};
字符串[]字段;
而(!parser.EndOfData)
{
fields=parser.ReadFields();
entries.Add(新的CSVFile()
{
请求\u ID=Convert.ToInt32(字段[0]),
优先级=转换为32(字段[1]),
Module_ID=Convert.ToInt32(字段[2])
//...
});
}
}
使用(SqlConnection conn=newsqlconnection(GetConnectionString()))
{
string sql=“Insert-INTO-Requests(Priority,Module_-ID)输出INSERTED.Request_-ID值(@Priority,@Module_-ID)”;
尝试
{
conn.Open();
foreach(条目中的CSVFile条目)
{
使用(SqlCommand cmd=newsqlcommand(sql,conn))
{
cmd.Parameters.AddWithValue(“@Priority”,entry.Priority);
cmd.Parameters.AddWithValue(“@Module\u ID”,entry.Module\u ID);
// ...
cmd.ExecuteNonQuery();
}
}
}
catch(System.Data.SqlClient.SqlException ex)
{
string msg=“插入错误:”;
msg+=例如消息;
抛出新异常(msg);
}
捕获(格式化对象异常)
{
System.Web.HttpContext.Current.Response.Write(“警报('请输入有效值');”);
}
捕获(System.Exception eeee)
{
System.Web.HttpContext.Current.Response.Write(“警报(‘系统异常’);”);
}
}
}
}
}
您需要使用csv文件中的相同字段创建一个表,例如,您的csv文件具有id、名字、姓氏、出生日期
文件的位置是C:\csvtest.txt
詹姆斯·史密斯,19750101
2,麦琪,史密斯,19790122
罗伯特·史密斯,20071101
亚历克斯·史密斯,20040202
CREATE TABLE tablename
(ID INT,
FirstName VARCHAR(40),
LastName VARCHAR(40),
BirthDate SMALLDATETIME)
GO
创建表后,可以通过以下命令在此表中插入csv数据。
您需要向您的csv文件位置传递消息
BULK
INSERT tablename
FROM 'c:\csvtest.txt'
WITH
(
FIELDTERMINATOR = ',',
ROWTERMINATOR = '\n'
)
GO
在.NET framework中有一个鲜为人知但令人惊讶的有用的文件解析器(尽管它的名称不同,但它可以在C#中使用) 首先,我将在您的
CSVFile
类中实现自动属性,而不是在公共字段中:
public class CSVFile
{
public int Request_ID { get; set; }
public int Priority { get; set; }
public int Module_ID { get; set; }
public string Day { get; set; }
public string Start_Time { get; set; }
// and so on
}
接下来,我将构建一个包含CSVFile
实例的列表(通用列表),用CSV文件中的数据填充每个实例(使用TextFieldParser
)。您需要添加对Microsoft.VisualBasic.FileIO
和using
指令的引用
using Microsoft.VisualBasic.FileIO;
List<CSVFile> entries = new List<CSVFile>();
using (TextFieldParser parser = new TextFieldParser(@"C:\CSVDATA\PreviousYear.csv"))
{
parser.TextFieldType = FieldType.Delimited;
parser.Delimiters = new string[]{','};
string[] fields;
while (!parser.EndOfData)
{
fields = parser.ReadFields();
entries.Add(new CSVFile() { Request_ID = Convert.ToInt32(fields[0]),
Priority = Convert.ToInt32(fields[1]),
Module_ID = Convert.ToInt32(fields[2]),
Day = fields[3],
Start_Time = fiedls[4],
// and the rest of the properties, casting as needed
};
}
}
从您的问题中不清楚您是使用所有条目更新表,还是仅使用选定的条目更新表。让我们假设(为了本例的目的)它是所有条目。您的队友已经为您提供了所需的内容-将其放入循环中,您可以将CSV文件中的所有数据输入SQL数据库,如t
<!DOCTYPE html>
<script runat="server">
Protected Sub Import_button_Click(sender As Object, e As EventArgs)
End Sub
Protected Sub Page_Load(sender As Object, e As EventArgs)
End Sub
</script>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Timetabling Support Website</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<!-- Loading Bootstrap -->
<link href="css/bootstrap.css" rel="stylesheet">
<!-- Loading Flat UI -->
<link href="css/flat-ui.css" rel="stylesheet">
<!-- Loading Unsemantic -->
<link href="css/unsemantic-grid-responsive.css" rel="stylesheet">
<!-- Loading Personalized Style -->
<link href="css/style.css" rel="stylesheet">
<link rel="shortcut icon" href="images/favicon.ico">
<!-- HTML5 shim, for IE6-8 support of HTML5 elements. All other JS at the end of file. -->
<!--[if lt IE 9]>
<script src="js/html5shiv.js"></script>
<![endif]-->
</head>
<body>
<form id="form1" runat="server">
<div class="grid-container">
<div class="header grid-100">
<div class="banner grid-70">
<img src="images/banner3.png" id="banner" alt="Loughborough Uni Logo" />
</div>
<div class="logout grid-30">
<p id="logout"> Welcome, Computer Science Timetabler. | <a href="index.html">Logout</a></p>
</div>
</div>
<div class="navbar navbar-inverse">
<div class="navbar-inner">
<ul class="nav">
<li>
<a href="home.html">
Home
</a>
</li>
<li>
<a href="#">
Requests
</a>
<ul>
<li>
<a href="request_new.html">New Request</a>
</li>
<li>
<a href="request_import.html">Import Requests</a>
</li>
<li>
<a href="request_current.html">Current Requests</a>
</li>
<li>
<a href="request_adhoc.html">Ad-Hoc Request</a>
</li>
</ul> <!-- /Sub menu -->
</li>
<li>
<a href="room_availability.html">
Room Availability
</a>
</li>
<li>
<a href="#">
History
</a>
<ul>
<li>
<a href="#">Semester 1</a>
<ul>
<li>
<a href="history_s1priority.html">Priority Round</a>
</li>
<li>
<a href="history_s1round1.html">Round 1</a>
</li>
<li>
<a href="history_current.html">Round 2</a>
</li>
<li>
<a href="history.html">Final Allocations</a>
</li>
</ul> <!-- /Sub menu -->
</li>
<li>
<a href="#">Semester 2</a>
<ul>
<li>
<a href="history.html">Priority Round</a>
</li>
<li>
<a href="history.html">Round 1</a>
</li>
<li>
<a href="history.html">Round 2</a>
</li>
<li>
<a href="history.html">Final Allocations</a>
</li>
</ul> <!-- /Sub menu -->
</li>
</ul> <!-- /Sub menu -->
</li>
<li>
<a href="#">
Maintenance
</a>
<ul>
<li>
<a href="module_add.html">Add Module</a>
</li>
<li>
<a href="module_edit.html">Edit Module</a>
</li>
</ul> <!-- /Sub menu -->
</li>
<li>
<a href="help.html">
Help
</a>
</li>
</ul>
</div><!--/.nav-collapse -->
</div>
<div class="content center">
<h1>Import Request
</h1>
<asp:Button ID="Button1" runat="server" Text="Button" OnClick="Import_button_Click"/>
<asp:GridView ID="GridView1" runat="server">
</asp:GridView>
</div>
<div class="grid-100 footer">
<p>Copyright © 2013 Team 3 Timetabling Support Website</p>
</div>
</div> <!-- /container -->
<asp:SqlDataSource ID="SqlDataSource1" runat="server"></asp:SqlDataSource>
<!-- Load JS here for greater good =============================-->
<script src="js/jquery-1.8.2.min.js"></script>
<script src="js/jquery-ui-1.10.0.custom.min.js"></script>
<script src="js/jquery.dropkick-1.0.0.js"></script>
<script src="js/custom_checkbox_and_radio.js"></script>
<script src="js/custom_radio.js"></script>
<script src="js/jquery.tagsinput.js"></script>
<script src="js/bootstrap-tooltip.js"></script>
<script src="js/jquery.placeholder.js"></script>
<script src="http://vjs.zencdn.net/c/video.js"></script>
<script src="js/application.js"></script>
<!--[if lt IE 8]>
<script src="js/icon-font-ie7.js"></script>
<script src="js/icon-font-ie7-24.js"></script>
<![endif]-->
</form>
</body>
</html>
string sql = "Insert INTO Requests (Priority);
OUTPUT INSERTED.Request_ID
VALUES (@Priority)";
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Microsoft.VisualBasic.FileIO;
using System.Data.SqlClient;
namespace ImportPage
{
public class CSVFile
{
public int Request_ID { get; set; }
public int Priority { get; set; }
public int Module_ID { get; set; }
//...
}
public class CSV
{
public string GetConnectionString()
{ return System.Configuration.ConfigurationManager.ConnectionStrings["team03ConnectionString"].ConnectionString; }
protected void button1_Click(object sender, EventArgs e)
{
List<CSVFile> entries = new List<CSVFile>();
using (TextFieldParser parser = new TextFieldParser(@"PreviousYear.csv"))
{
parser.TextFieldType = FieldType.Delimited;
parser.Delimiters = new string[] { "," };
string[] fields;
while (!parser.EndOfData)
{
fields = parser.ReadFields();
entries.Add(new CSVFile()
{
Request_ID = Convert.ToInt32(fields[0]),
Priority = Convert.ToInt32(fields[1]),
Module_ID = Convert.ToInt32(fields[2])
//...
});
}
}
using (SqlConnection conn = new SqlConnection(GetConnectionString()))
{
string sql = "Insert INTO Requests (Priority, Module_ID) OUTPUT INSERTED.Request_ID VALUES (@Priority, @Module_ID)";
try
{
conn.Open();
foreach (CSVFile entry in entries)
{
using (SqlCommand cmd = new SqlCommand(sql, conn))
{
cmd.Parameters.AddWithValue("@Priority", entry.Priority);
cmd.Parameters.AddWithValue("@Module_ID", entry.Module_ID);
// ...
cmd.ExecuteNonQuery();
}
}
}
catch (System.Data.SqlClient.SqlException ex)
{
string msg = "Insert Error:";
msg += ex.Message;
throw new Exception(msg);
}
catch (FormatException ee)
{
System.Web.HttpContext.Current.Response.Write("<SCRIPT LANGUAGE='JavaScript'>alert('Please enter a valid value');</SCRIPT>");
}
catch (System.Exception eeee)
{
System.Web.HttpContext.Current.Response.Write("<SCRIPT LANGUAGE='JavaScript'>alert('System Exception');</SCRIPT>");
}
}
}
}
}
CREATE TABLE tablename
(ID INT,
FirstName VARCHAR(40),
LastName VARCHAR(40),
BirthDate SMALLDATETIME)
GO
BULK
INSERT tablename
FROM 'c:\csvtest.txt'
WITH
(
FIELDTERMINATOR = ',',
ROWTERMINATOR = '\n'
)
GO
public class CSVFile
{
public int Request_ID { get; set; }
public int Priority { get; set; }
public int Module_ID { get; set; }
public string Day { get; set; }
public string Start_Time { get; set; }
// and so on
}
using Microsoft.VisualBasic.FileIO;
List<CSVFile> entries = new List<CSVFile>();
using (TextFieldParser parser = new TextFieldParser(@"C:\CSVDATA\PreviousYear.csv"))
{
parser.TextFieldType = FieldType.Delimited;
parser.Delimiters = new string[]{','};
string[] fields;
while (!parser.EndOfData)
{
fields = parser.ReadFields();
entries.Add(new CSVFile() { Request_ID = Convert.ToInt32(fields[0]),
Priority = Convert.ToInt32(fields[1]),
Module_ID = Convert.ToInt32(fields[2]),
Day = fields[3],
Start_Time = fiedls[4],
// and the rest of the properties, casting as needed
};
}
}
GridView1.DataSource = entries;
GridView1.DataBind();
// It's considered best practice to use a `using` block with `SqlConnection`
// (among other objects). The `using` block ensures the connection is properly
// disposed of once execution leaves the block.
using (SqlConnection con = new SqlConnection(GetConnectionString()))
{
// I'm breaking into individual lines here simply
// so it's easier to read on SO
string sql = "Insert INTO Requests (Priority, Module_ID, Day,
Start_Time, Length, Park,
Students, Room_Code, Status,
Room_Allocated, Semester_ID,
Week_1, Week_2, Week_3, Week_4,
Week_5, Week_6, Week_7, Week_8,
Week_9, Week_10, Week_11, Week_12,
Week_13, Week_14, Week_15)
OUTPUT INSERTED.Request_ID
VALUES (@Priority, @Module_ID, @Day, @Start_Time,
@Length, @Park, @Students, @Room_Code,
@Status, @Room_Allocated, @Semester_ID,
@Week_1, @Week_2, @Week_3, @Week_4, @Week_5,
@Week_6, @Week_7, @Week_8, @Week_9, @Week_10,
@Week_11, @Week_12, @Week_13, @Week_14, @Week_15)";
try
{
conn.Open();
foreach (CSVFile entry in entries)
{
using (SqlCommand cmd = new SqlCommand(sql, conn))
{
cmd.Parameters.AddWithValue("@Priority", entry.Priority);
cmd.Parameters.AddWithValue("@Module_ID", entry.Module_ID);
cmd.Parameters.AddWithValue("@Day", entry.Day);
cmd.Parameters.AddWithValue("@Start_Time", entry.Start_Time);
// And so on
cmd.ExecuteNonQuery();
}
}
}
catch (System.Data.SqlClient.SqlException ex)
{
string msg = "Insert Error:";
msg += ex.Message;
throw new Exception(msg);
}
catch (FormatException ee)
{
System.Web.HttpContext.Current.Response.Write("<SCRIPT LANGUAGE='JavaScript'>alert('Please enter a valid value');</SCRIPT>");
}
catch (System.Exception eeee)
{
System.Web.HttpContext.Current.Response.Write("<SCRIPT LANGUAGE='JavaScript'>alert('System Exception');</SCRIPT>");
}
} // Since we're in a `using` block, there is no need for the `finally` block
// close the connection.