问题描述
我想要在数据库中读到一行数据时,执行更新,读不到数据时,就执行插入数据;可是sqlcommand和sqldatareader好像只能执行一个,请教各位,我该怎么做才能实现该功能privatevoidtestToolStripMenuItem_Click(objectsender,EventArgse){//构造连接字符串stringconnstr=System.Configuration.ConfigurationManager.ConnectionStrings["wintechdb"].ConnectionString;SqlConnectionconn=newSqlConnection(connstr);//构造连接对象stringselectsql="select*from"+"""+pnumber.Text+""";SqlCommandcmdSelect=newSqlCommand(selectsql,conn);//构造命令对象conn.Open();for(inti=0;i<dataGridView1.Rows.Count-1;i++){//获取datagridview单元格数据stringnumber=dataGridView1.Rows[i].Cells["图号"].Value.ToString();stringname=dataGridView1.Rows[i].Cells["名称"].Value.ToString();stringsize=dataGridView1.Rows[i].Cells["规格"].Value.ToString();intamount;boolb1=int.TryParse(dataGridView1.Rows[i].Cells["数量"].Value.ToString(),outamount);stringmaterial=dataGridView1.Rows[i].Cells["材料"].Value.ToString();doublepiece;doubletotal;boolb2=double.TryParse(dataGridView1.Rows[i].Cells["单重"].Value.ToString(),outpiece);boolb3=double.TryParse(dataGridView1.Rows[i].Cells["总重"].Value.ToString(),outtotal);stringremark=dataGridView1.Rows[i].Cells["备注"].Value.ToString();SqlDataReaderreader=cmdSelect.ExecuteReader();//读取表格if(reader.Read())//如果读到则更新数据{stringsqlstr="update"+"""+pnumber.Text+"""+"setbdrawnumber='"+number+"',"+"bname='"+name+"',bsize='"+size+"',bamount='"+amount+"',bmaterial='"+material+"',bpieceweight='"+piece+"',"+"btotalweight='"+total+"',bremark='"+remark+"'";SqlCommandcmdUpdate=newSqlCommand(sqlstr,conn);reader.Close();reader.Dispose();cmdUpdate.ExecuteNonQuery();}else//没有读到数据则插入数据{stringsqlstr="insertinto"+"""+pnumber.Text+"""+"(bdrawnumber,bname,bsize,bamount,bmaterial,bpieceweight,"+"btotalweight,bremark)values('"+number+"','"+name+"','"+size+"','"+amount+"','"+material+"','"+piece+"','"+total+"','"+remark+"')";SqlCommandcmdInsert=newSqlCommand(sqlstr,conn);reader.Close();reader.Dispose();cmdInsert.ExecuteNonQuery();}}MessageBox.Show("写入数据库成功");conn.Dispose();}
解决方案
解决方案二:
我上面的代码只能实现更新一行,因为每次都将reader关闭了,该怎么改才是正确的
解决方案三:
使用存储过程,将逻辑写在存储过程里
解决方案四:
你无非就是想通过dgv控件同时实现数据的修改与新增。况且你的selectsql只执行了一次,因为你的pnumber看着是没有变化的。逻辑有问题吧,最好使用DataAdapter与DataSet使用Binding方式对dgv进行操作。参见: