新人求助:关于SQL数据库中数据更新

Il Mare 2019-01-19 10:05:01
我用button控件把Excel的数据导入到了SQL数据库中,但是现在我的表格数据有更新,我该如何更新数据库中的数据呢?就比如之前有100行数据,现在表中有150行数据(实际数据较多),我该如何更新数据库。再次导入表格好像不可行。还请大佬们教我一下
...全文
325 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
Il Mare 2019-01-21
  • 打赏
  • 举报
回复
引用 8 楼 吉普赛的歌 的回复:
excel 导入到 datatable , 可以用 NPOI 。

你先把你的代码贴出来再说吧。因为不知道你到底哪一步不会。

我自己写不出来,所以把别人的代码拿来改了。上边一个是写入数据一个是清除数据的代码,这两个单独都是可以运行的,但我就是不知道咋合在一起,放到一个button控件里。。。。。。
Il Mare 2019-01-21
  • 打赏
  • 举报
回复
把数据写入数据库:
private void buttonWrite_Click(object sender, EventArgs e)
{

//测试,将excel中的student导入到sqlserver的db_test中,如果sql中的数据表不存在则创建
string connString = "server = (local); uid = sa; pwd = 88888888; database = db_test";
System.Windows.Forms.OpenFileDialog fd = new OpenFileDialog();
// 设置文件格式
fd.Filter = "Excel files office2003(*.xls)|*.xls|Excel office2013(*.xlsx)|*.xlsx|All files (*.*)|*.*";
if (fd.ShowDialog() == DialogResult.OK)
{
this.textFilepath.Text = fd.FileName;
this.textFilepath.ReadOnly = true;

TransferData(fd.FileName, "FYA02201109228", connString);
}
}
public void TransferData(string excelFile, string sheetName, string connectionString)
{
DataSet ds = new DataSet();
try
{
//获取全部数据
string strConn = "Provider=Microsoft.Ace.OleDb.12.0;" + "Data Source=C:\\Users\\Administrator\\Desktop\\A02201109228(FY).xlsx; " + "Extended Properties='Excel 12.0'";
OleDbConnection conn = new OleDbConnection(strConn);
conn.Open();
string strExcel = "";
OleDbDataAdapter myCommand = null;
strExcel = string.Format("select * from [Sheet1$]", sheetName);
myCommand = new OleDbDataAdapter(strExcel, strConn);
myCommand.Fill(ds, sheetName);

//如果目标表不存在则创建,excel文件的第一行为列标题,从第二行开始全部都是数据记录
string strSql = string.Format("if not exists(select * from sysobjects where name = '{0}') create table {0}(", sheetName); //以sheetName为表名

foreach (System.Data.DataColumn c in ds.Tables[0].Columns)
{
strSql += string.Format("[{0}] varchar(255),", c.ColumnName);
}
strSql = strSql.Trim(',') + ")";

using (System.Data.SqlClient.SqlConnection sqlconn = new System.Data.SqlClient.SqlConnection(connectionString))
{
sqlconn.Open();
System.Data.SqlClient.SqlCommand command = sqlconn.CreateCommand();
command.CommandText = strSql;
command.ExecuteNonQuery();
sqlconn.Close();
}
//用bcp导入数据
//excel文件中列的顺序必须和数据表的列顺序一致,因为数据导入时,是从excel文件的第二行数据开始,不管数据表的结构是什么样的,反正就是第一列的数据会插入到数据表的第一列字段中,第二列的数据插入到数据表的第二列字段中,以此类推,它本身不会去判断要插入的数据是对应数据表中哪一个字段的
using (System.Data.SqlClient.SqlBulkCopy bcp = new System.Data.SqlClient.SqlBulkCopy(connectionString))
{
bcp.SqlRowsCopied += new System.Data.SqlClient.SqlRowsCopiedEventHandler(bcp_SqlRowsCopied);
bcp.BatchSize = 100;//每次传输的行数
bcp.NotifyAfter = 100;//进度提示的行数
bcp.DestinationTableName = sheetName;//目标表
bcp.WriteToServer(ds.Tables[0]);
}
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
System.Windows.Forms.MessageBox.Show(ex.Message);
}
}



清空数据库:
private void buttonUpdate_Click(object sender, EventArgs e)
{
SqlConnection conn = new SqlConnection("server=.;database=db_test;uid=sa;pwd=88888888");
string sql = "truncate table FYA02201109228"; //清空数据库这个表格中的数据 “drop table FYA02201109228”是直接删除这个表
SqlCommand comm = new SqlCommand(sql, conn);
conn.Open();
comm.ExecuteNonQuery();
conn.Close();
}
Il Mare 2019-01-20
  • 打赏
  • 举报
回复
引用 1 楼 秋天之落叶 的回复:
1、删除数据表数据,重新导入
2、知道excel的新增行,仅导入新增行
3、知道更新行,删除数据表中的更新行,导入更新行
4、用你会的语言编程:取出excel表中的所有数据,循环,逐行对比判断数据库的数据,1不存在,插入记录,2存在,2.1记录是否已经更新,已更新,修改记录,2.2未更新,跳过记录,继续循环,直到结束。


谢谢,我尝试使用删除数据表后重新写入,但是重新写入之后数据都成了null,不知啥原因?如果采用低四种方法,那我数据很多(比如几万条),那不是很慢么?求解答
吉普赛的歌 版主 2019-01-20
  • 打赏
  • 举报
回复
excel 导入到 datatable , 可以用 NPOI 。 你先把你的代码贴出来再说吧。因为不知道你到底哪一步不会。
Il Mare 2019-01-20
  • 打赏
  • 举报
回复
引用 6 楼 吉普赛的歌 的回复:
看数据量吧。

如果顶多一二十万, 其实:
1. truncate table 表名;
2. 程序将 excel 导入到 datatable, 再用 sqlbulkcopy 导入到数据表

这个过程可能也就十秒左右, 可以接受的了。

谢谢回复,我现在就是在用这个办法尝试。但是我想把这两个功能集成到一个button控件中操作,是否可行?还请指导我一下,新手看了一下午没操作出来。先谢过了
吉普赛的歌 版主 2019-01-20
  • 打赏
  • 举报
回复
看数据量吧。 如果顶多一二十万, 其实: 1. truncate table 表名; 2. 程序将 excel 导入到 datatable, 再用 sqlbulkcopy 导入到数据表 这个过程可能也就十秒左右, 可以接受的了。
秋天之落叶 2019-01-20
  • 打赏
  • 举报
回复
当然,你用存储可能会更快一些,大家都这么说,我没有这么大的数据量,体验不出来。
Il Mare 2019-01-20
  • 打赏
  • 举报
回复
引用 3 楼 秋天之落叶 的回复:
1、你要是想把空写成0,可以使用isnull(cast(字段名 as 数据类型),0);你要是正常值导入后变成空,那肯定是写入的问题,检查一下语句。
2、要是几万条记录,循环可能会很慢,那你就用 insert into 数据表 select * from 数据表,excel表 where 条件(数据表没有的,excel表有的)这种形式可能快一点。如果记录有更新,再用update语句。
我也就会这些了

好的谢谢你,我看一下
秋天之落叶 2019-01-20
  • 打赏
  • 举报
回复
1、你要是想把空写成0,可以使用isnull(cast(字段名 as 数据类型),0);你要是正常值导入后变成空,那肯定是写入的问题,检查一下语句。
2、要是几万条记录,循环可能会很慢,那你就用 insert into 数据表 select * from 数据表,excel表 where 条件(数据表没有的,excel表有的)这种形式可能快一点。如果记录有更新,再用update语句。
我也就会这些了
秋天之落叶 2019-01-19
  • 打赏
  • 举报
回复
1、删除数据表数据,重新导入
2、知道excel的新增行,仅导入新增行
3、知道更新行,删除数据表中的更新行,导入更新行
4、用你会的语言编程:取出excel表中的所有数据,循环,逐行对比判断数据库的数据,1不存在,插入记录,2存在,2.1记录是否已经更新,已更新,修改记录,2.2未更新,跳过记录,继续循环,直到结束。

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧