aspnet/c#代码实现excel to mssql数据导入
2008年12月17日 星期三 13:42
做网站项目时,可能会遇到将excel文件中的数据导入至sql server数据库的需求,把excel也看作数据库,使用OleDb连接后读取数据然后写入用SqlClient连接的sql server数据库即可,技术上没有什么难度。
但是需要考虑的一个问题是,系统安装的环境一般是专用sql server服务器+web服务器+客户端,而excel文件往往在客户端导入,如果直接使用sql语句读取的话,由于sql在web服务器上运行,不能读取到客户端的excel地址,就会出错了。
既然知道了错误的原因,解决方案也就有了:
1、把客户端的excel上传至web服务器上某文件夹,注意要给该文件夹设置网络用户的“写入”权限;
2、使用OleDb+sql语句读取web服务器上的excel文件
3、将读取的数据写入到sql server 数据库
4、将web服务器上的临时excel删除
部分代码如下:
string filename = FileUpload1PostedFileFileNameSubstring(FileUpload1PostedFileFileNameLastIndexOf("\\"));
FileUpload1PostedFileSaveAs(ServerMapPath("fileupload\\") + filename);//上传文件
string conn = "Provider=MicrosoftJetOLEDB40;Data Source=" + ServerMapPath("fileupload\\") + filename + ";Extended Properties=Excel 80";
string sqlin = "SELECT FROM [Sheet2$]";
OleDbCommand olecommand = new OleDbCommand(sqlin, new OleDbConnection(conn));
OleDbDataAdapter adapterin = new OleDbDataAdapter(olecommand);
DataSet dsin = new DataSet();
adapterinFill(dsin);
DataTable dtin = dsinTables[0];//连接并读取excel数据
for (i = 3; i <= totalrow; i++)//将Excel文件中第一个工作表的数据导入到sql数据库scjd_youliaoxiaohaojihua表中
{
string sql = "insert into scjd_youliaoxiaohaojihua(yuexuhao,danwei,youpin,cheliangmingchengxinghao,zichanxingzhi,chepaihao,qiyou,chaiyou,beizhu) values('";
int j;
sql += DropDownList1SelectedValueToString() + DropDownList3SelectedValueToString();
if (DropDownList1SelectedValueToString() != DateTimeNowYearToString() || intParse(DateTimeNowMonthToString()) != intParse(DropDownList3SelectedValueToString()))
{
sql += "20";
}
else
{
if (intParse(DateTimeNowDayToString()) < 10)
sql += "0";
sql += DateTimeNowDayToString();
}
if (i-3 + count < 9)
sql += "00";
else if (i-3 + count < 99)
sql += "0";
sql += (i -3 + 1 + count)ToString();
sql += "','";
for (j = 1; j < 8; j++)
{//遍历Excel表中一行的所有列,除最后一列
sql += dtinRows[i][j]ToString()Trim();
sql += "','";
}
sql += dtinRows[i][8]ToString()Trim();
sql += "')";
try
{
DoSql(sql);
}
catch (Exception eeeeeee)
{
ResponseWrite("<script>alert('数据导入错误,请检查Excel文件')</script>");
return;
}
}
FileInfo file = new FileInfo(ServerMapPath("fileupload/") + filename);
if (fileExists)
{//删除文件
fileDelete();
}
protected void DoSql(string sql)//执行sql语句的函数
{
SqlConnection conn = new SqlConnection();//创建连接对象
connConnectionString = ConfigurationManagerAppSettings["conn"]ToString();//给连接字符串赋值
connOpen();//打开数据库
SqlCommand cmd = new SqlCommand(sql, conn);
cmdExecuteNonQuery();//
connClose();//关闭数据库
}
注:
1、本文代码均取自我最近刚做的一个小项目,部分数据有较强针对性,并不通用,只有思路通用
2、由于能力和水平问题,部分代码显得有些笨拙,若能灵活运用存储过程,应能大幅度简化代码 只要你的文件能够用记事本打开并格式正确,就可以把他认为是文本文件进行处理
象这种格式的数据没有什么太好的办法,只有从文本文件中逐行读取解析,当读到完整的记录时执行SQL语句插入到数据库中
1、启动SQL企业管理器,选中 表格:1、点击鼠标右键 2、所以任务 3、导入数据
2、选择数据源
3、选择文件路径
4、按txt文本格式,选择相应的分隔符和间距,就可以了。
不知道你要什么样的文本,文本中的内容是否是有格式的:
这里提供下思路,供参考:
1文本文件,基本上式字符格式的了,可以用Reader io流
2如果是格式化的文本,可以按数据的长度读取, readInt readByte
3保存到数据库 当然用JDBC了,如果你读取出来封装成POJO了,也可以选择 OM框架
import javaioBufferedReader;
import javaioFileInputStream;
import javaioIOException;
import javaioInputStreamReader;
/
文件读取和写入数据库
@author 樊云升
/
public class FilesReader {
public FilesReader(){
}
/
读取文件内容
@param FILE
@return
/
public String re_content(String FILE){
String content="";
try{
BufferedReader bufRead=new BufferedReader(new InputStreamReader(new FileInputStream(FILE)));
String str;
while((str=bufReadreadLine())!=null){
content+=str+"\r\n";
}
}catch(IOException ioe){
ioeprintStackTrace();
}
return content;
}
/
将特定字符写入数据库中(原来我写的是重写文件,你这里这里将content写入数据库就OK)
@param path
@return
/
public boolean writeFile(String content){
try{
//数据库写入代码
}catch(Exception e){
outclose();
return false;
}
return true;
}
public static void main(String[] args) {
String content=new FilesReader()re_content("D:\\AJAXhtm");
new FilesReader()writeFile(content);
}
}
假如文本文件是按如下格式:
D,356,ABC,12765,,L
C,356,ABD,45678,,M
定义一个1维数组,对文本文件逐行读入,然后逐条添加到数据库的表中,代码如下,本人调试时用了10个字段数据,你可依据你的情况作修改:
Option Explicit
Dim data(10) As String
Dim i As Integer
Private Sub Command1_Click()
Open "c:\txt_mdb\mdlk_sjtxt" For Input As #1
Do Until EOF(1)
Input #1, data(0), data(1), data(2), data(3), data(4), data(5), data(6), data(7), data(8), data(9)
Adodc1RecordsetAddNew
For i = 0 To 9
Adodc1Recordset(i) = Trim(data(i))
Next i
Loop
Close
End Sub
Private Sub Form_Load()
Adodc1ConnectionString = "Provider=MicrosoftJetOLEDB40;Data Source=C:\TXT_MDB\db1mdb;Persist Security Info=False"
Adodc1RecordSource = "select from tabel1"
Adodc1Refresh
Text1 = ""
End Sub
方法如下,举例说明:
1、创建测试表,即为要被导入的表:
create table person(
id int not null auto_increment,
name varchar(40) not null,
city varchar(20),
salary int,
primary key(id)
)engine=innodb charset=gb2312;
2、接着写一个用于导入的文本文件:c:\datatxt。
张三
31
北京
3000
李四
25
杭州
4000
王五
45
\N
4500
小明
29
天津
\N
每一项之间用Tab键进行分隔,如果该字段为NULL,则用\N表示。
3、导入数据
输入命令,进行导入。
load
data
local
infile
“c:/datatxt”
into
table
person(name,age,city,salary);
导入数据截图如下:
其中local表示本地。执行后,可以看到NULL数据也被正确地导入。
以上就是关于如何将文本文档批量数据导入到数据库中全部的内容,包括:如何将文本文档批量数据导入到数据库中、如何用sqlldr将文本文件中的数据导入到数据库表中、读取文本文件中的内容存到数据库该怎么实现等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)