我有一个表单,用户可以在其中插入,查看和更新数据。数据插入只进行一次,然后可以多次进行更新。默认情况下,用户将能够查看数据库中是否存在数据。
我尝试了这个,但它没有插入数据库。然后假设数据库中存在数据,当用户想要更新记录时,它会抛出错误 - DataReader已打开。
private void display_Emp()
{
try
{
using (sqlCon = new SqlConnection(ConfigurationManager.ConnectionStrings["Connection"].ConnectionString))
{
sqlCon.Open();
SqlDataAdapter da = new SqlDataAdapter("SELECT * FROM Employee", sqlCon);
DataSet ds = new DataSet("Employee");
da.Fill(ds, "Employee");
int x = 0;
for (x = 0; x < ds.Tables[0].Rows.Count; x++)
{
txtID.Text = ds.Tables[0].Rows[x][1].ToString();
txtEmpName.Text = ds.Tables[0].Rows[x][2].ToString();
}
}
}
catch(Exception exx) {
MessageBox.Show(exx.Message);
}
finally {
sqlCon.Close();
}
}
private void btnSave_Click(object sender, EventArgs e)
{
try
{
using (sqlCon = new SqlConnection(ConfigurationManager.ConnectionStrings["Connection"].ConnectionString))
{
sqlCon.Open();
SqlCommand com = new SqlCommand("SELECT * FROM Employee", sqlCon);
read = com.ExecuteReader();
while (read.Read())
{
if (read.HasRows)
{
SqlCommand update = new SqlCommand("UPDATE Employee SET EmpID = '" + txtID.Text + "' , EmpName = '" + txtEmpName.Text + "', sqlCon);
update.ExecuteNonQuery();
MessageBox.Show("Employee details updated!", "Employee", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
else
{
SqlCommand comm = new SqlCommand("INSERT INTO Employee(EmpID, EmpName) VALUES ('" + txtID.Text + "','" + txtEmpName.Text + "')", sqlCon);
comm.ExecuteNonQuery();
MessageBox.Show("Employee details saved!", "Employee", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
}
}
catch(Exception ex)
{
MessageBox.Show(ex.Message);
}
finally
{
read.Close();
sqlCon.Close();
}
}
修改
表: - Deepz(ID int PK,Goodname varchar(50))
DECLARE @ID int
DECLARE @Goodname varchar(50)
MERGE Deepz t
USING (SELECT @ID[ID], @Goodname[Goodname]) s
ON (t.ID = s.ID)
WHEN MATCHED THEN
UPDATE
SET t.Goodname = @Goodname
WHEN NOT MATCHED THEN
INSERT (ID, Goodname)
VALUES (@ID, @Goodname);
错误:
Msg 102, Level 15, State 1, Line 1
Incorrect syntax near 't'.
Msg 137, Level 15, State 2, Line 2
Must declare the scalar variable "@ID".
答案 0 :(得分:3)
您应该将保存功能更改为:
DECLARE @nameField VarChar(50) = 'some data' MERGE dbo.MyTable t USING (SELECT @nameField [field]) s ON t.myData = s.field WHEN MATCHED THEN UPDATE SET t.myData = @nameField WHEN NOT MATCHED THEN INSERT (myData) VALUES (@nameField);
IF EXISTS (SELECT * FROM Deepz WHERE [ID] = @ID) BEGIN UPDATE Deepz SET Goodname = @Goodname WHERE [ID] = @ID END ELSE BEGIN INSERT Deepz (ID, Goodname) VALUES (@ID, @Goodname); END
UPDATE Employee SET EmpID = @id, EmpName = @name
然后
SqlCommand comm = new SqlCommand(...); // note below is a bit simplified, in reality you should do int.TryParse comm.Parameters.Add(@id, SqlDbType.Int).Value = int.Parse(txtID.Text);
答案 1 :(得分:0)
这是在黑暗中的一点点,但试试这个:
private void btnSave_Click(object sender, EventArgs e)
{
try
{
using (sqlCon = new SqlConnection(ConfigurationManager.ConnectionStrings["Connection"].ConnectionString))
{
sqlCon.Open();
SqlCommand com = new SqlCommand("SELECT * FROM Employee", sqlCon);
com.Parameters.AddWithValue(@empID, SqlDbType.Int).Value = int.Parse(txtID.Text); // Add this line
com.Parameters.AddWithValue(@empName, SqlDbType.NVarChar).Value = txtEmpName.Text; // Add this line too
SqlDataReader read = new SqlDataReader(); // You also need to 'new' up your SqlDataReader.
read = com.ExecuteReader();
while (read.Read())
{
if (read.HasRows)
{
SqlCommand update = new SqlCommand("UPDATE Employee SET EmpID = @empID, EmpName = @empName", sqlCon);
update.ExecuteNonQuery();
MessageBox.Show("Employee details updated!", "Employee", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
else
{
SqlCommand comm = new SqlCommand("INSERT INTO Employee(EmpID, EmpName) VALUES (@empID, @empName)", sqlCon);
comm.ExecuteNonQuery();
MessageBox.Show("Employee details saved!", "Employee", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
}
catch(Exception ex)
{
MessageBox.Show(ex.Message);
}
finally
{
read.Close();
sqlCon.Close();
}
}
答案 2 :(得分:0)
从示例中我看“If”条件和“While”条件看起来是倒置的。
http://msdn.microsoft.com/en-us/library/haa3afyz%28v=vs.80%29.aspx
先检查是否有行,然后迭代它们