
打开企业管理器,打开要导入数据的数据库,在表上按右键,所有任务-->导入数据,d出DTS导入/导出向导,按 下一步 , 2、选择数据源 Microsoft Excel 97-2000,文件名 选择要导入的xls文件,按 下一步 , 3、选择目的 用于SQL Server 的Microsoft OLE DB提供程序,服务器选择本地(如果是本地数据库的话,如 VVV),使用SQL Server身份验证,用户名sa,密码为空,数据库选择要导入数据的数据库(如 client),按 下一步 , 4、选择 用一条查询指定要传输的数据,按 下一步 , 5、按 查询生成器,在源表列表中,有要导入的xls文件的列,将各列加入到右边的 选中的列 列表中,这一步一定要注意,加入列的顺序一定要与数据库中字段定义的顺序相同,否则将会出错,按 下一步 , 6、选择要对数据进行排列的顺序,在这一步中选择的列就是在查询语
最近利用空闲时间自己在写一个文件备份工具,因为我磁盘上的很多文件很重要,例如很多PPT和讲义。所以需要经常备份,而且因为这些文件很多,所以需要增量备份。
我尝试用过windows自带的ntbackup工具,但感觉不是很爽。它不支持压缩备份,而且界面也有点复杂。
为了响应伟大领袖的“自力更生,丰衣足食”的号召,咱决定自己写一个工具,专门备份到数据库。支持压缩,支持加密,支持增量。
本文分享一下其中一些重点的技术细节
其中一个关键的技术就是将文件使用二进制的方式存放在数据库的varbinary(max)的字段中。该字段最大允许的长度为2GB。
对于一些小文件,我们可以一次性读取它的所有字节,然后一次提交到数据库
/// <summary>
/// 这个方法演示了如何一次提交所有的字节。这样导致的结果是:应用程序立即需要申请等同于文件大小的内存
/// </summary>
static void SubmitFileByOnce() {
string file = @"F:\功夫熊猫rmvb";//文件大小为519MB
byte[] buffer = FileReadAllBytes(file);
using (SqlConnection conn = new SqlConnection("server=(local);database=demo;integrated security=true")) {
using (SqlCommand cmd = connCreateCommand())
{
cmdCommandText = "INSERT INTO Files(FileName,FileContents) VALUES(@fileName,@fileContents)";
cmdParametersAddRange(
new[]
{
new SqlParameter("@fileName",file),
new SqlParameter("@fileContents",buffer)
});
connOpen();
cmdExecuteNonQuery();
connClose();
}
}
}
但是,上面的方法有几个问题,主要体现在如果文件比较大的话
1 它需要一次性很大的内存,具体数据等同于文件大小。因为FileReadAllBytes方法是将所有字节全部读入到内存。
2 它会导致提交失败,就是因为数据太大了。数据库也会拒绝。
那么,我就对这个方法做了一下改进,将文件拆分为5MB一段,也就是说,此时每次申请的内存只有5MB。这就大大地提高了可用性。
/// <summary>
/// 这个方法是将文件切分为5MB的块,每次只是提交5MB,所以可能多次提交,但内存占用就比较小
/// </summary>
static void SubmitFileStepByStep() {
string file = @"F:\功夫熊猫rmvb";//以这个文件为例,大小为519MB,一共需要的时间大约94秒。还是有点慢的,所以还可能需要进行压缩
FileStream fs = new FileStream(file, FileModeOpen);
byte[] buffer = new byte[5 1024 1024];
int readCount;
using (SqlConnection conn = new SqlConnection("server=(local);database=demo;integrated security=true"))
{
connOpen();
while ((readCount = fsRead(buffer, 0, bufferLength)) > 0)
{
using (SqlCommand cmd = connCreateCommand())
{
cmdCommandText = "INSERT INTO Files(FileName,FileContents) VALUES(@fileName,@fileContents)";
cmdParametersAddRange(
new[]
{
new SqlParameter("@fileName",file),
new SqlParameter("@fileContents",buffer)
});
cmdExecuteNonQuery();
}
}
connClose();
}
}
这样的话,有一个后果就是一个文件,可能在数据库中会有多条记录。所以在读取的时候,我们需要对其进行合并
static void DownloadFile() {
string file = @"F:\功夫熊猫rmvb";
string destfile = @"E:\Temp\Tempwmv";
using (SqlConnection conn = new SqlConnection("server=(local);database=demo;integrated security=true"))
{
using (SqlCommand cmd = connCreateCommand())
{
cmdCommandText = "SELECT FileContents FROM Files WHERE FileName=@fileName";
cmdParametersAddRange(
new[]
{
new SqlParameter("@fileName",file),
});
connOpen();
SqlDataReader reader = cmdExecuteReader();
FileStream fs = new FileStream(destfile, FileModeAppend, FileAccessWrite);
while (readerRead())
{
byte[] buffer = (byte[])reader[0];
fsWrite(buffer, 0, bufferLength);
}
fsClose();
readerClose();
connClose();
}
}
}
本文由作者:陈希章
附加数据库就可以完成
附加数据库:企业管理器--右键"数据库"--所有任务--附加数据库
--选择你的mdf文件名--确定--如果提示没有ldf文件,是否创建,选择"是"
查询分析器中的方法:
--有数据文件及日志文件的情况
sp_attach_db
'数据库名'
,'数据文件名(mdf注意要带目录)'
--后面可以是用,分隔的该数据库的多个数据文件
,'日志文件名(ldf注意要带目录)'--后面可以是用,分隔的该数据库的多个日志文件
--如果只有数据文件的情况,'数据文件名(mdf注意要带目录)'
--后面可以是用,分隔的该数据库的多个数据文件
首先数据库存储数据有自己的格式:基本数据类型、二进制。。
怎么存储文件形式的数据?
1、针对txt文件,读取文本内容,数据库字段设置数据类型text,将读取的文本内容存入数据库。
2、转化为二进制存入数据库,读取文件,转化为二进制流,数据库字段设置bit,之后将二进制数据存入数据库,
3、将txt文件保存服务器制定目录下,在数据库中存储txt的绝对路径,访问时直接访问文件即可。
以上就是关于怎么将Excel中的数据传到数据库中全部的内容,包括:怎么将Excel中的数据传到数据库中、如何将大文件写入到数据库中、如何将数据库文件导入数据库中等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)