连接模式,一般是四大对象
SqlConnectionn
SqlCommand #通过SQL操作的对象
SqlParameter #防止SQL注入而使用的参数化SQL语句,配合SqlCommand (可以不用)
SqlDataReader #如何SqlCommand执行的是查询语句,这个是获取的结果集对象
如下
/* 以下使用连接模式 */ SqlConnection cnn = new SqlConnection(strCnn); SqlCommand cmd = new SqlCommand(); // 有重载构造函数,如 SqlCommand(string sql, SqlConnection cnn) cmd.Connection = cnn; cmd.CommandText = "insert into StudInfo values(@StuNo, @Name, @Birth, @MajorId, @Image)"; // 使用SqlParameter为SqlCommand对象准备参数 SqlParameter stuNoParam = new SqlParameter(); SqlParameter nameParam = new SqlParameter(); SqlParameter birthParam = new SqlParameter(); SqlParameter majorParam = new SqlParameter(); SqlParameter imageParam = new SqlParameter(); // 设置SqlParameter对象指向对应参数 stuNoParam.ParameterName = "@StuNo"; nameParam.ParameterName = "@Name"; birthParam.ParameterName = "@Birth"; majorParam.ParameterName = "@MajorId"; imageParam.ParameterName = "@Image"; // 给参数赋值 stuNoParam.Value = StuNo.Text.Trim(); nameParam.Value = Name.Text.Trim(); birthParam.Value = Birth.Text.Trim(); majorParam.Value = MajorId.Text.Trim(); imageParam.Value = Image.FileName.Trim(); // 将SqlParameter对象绑定到SqlCommand对象下 cmd.Parameters.Add(stuNoParam); cmd.Parameters.Add(nameParam); cmd.Parameters.Add(birthParam); cmd.Parameters.Add(majorParam); cmd.Parameters.Add(imageParam); // 打开连接执行 try { cnn.Open(); cmd.ExecuteNonQuery(); Label2.Text = "提交成功"; cnn.Close(); } catch (Exception ex) { // }
包括SqlDataReader的
string strCnn = ConfigurationManager.ConnectionStrings["StudentCnnString"].ConnectionString; SqlConnection cnn = new SqlConnection(strCnn); SqlCommand cmd = new SqlCommand(); SqlCommand cmd2 = new SqlCommand(); cmd.Connection = cnn; cmd2.Connection = cnn; cmd.CommandText = "select * from StudInfo"; SqlDataReader stuReader = null; try { if (cnn.State == ConnectionState.Closed) cnn.Open(); stuReader = cmd.ExecuteReader(); Response.Write("<table border = '1'><tr align = 'center'>"); // 输出表格所有字段 for (int i = 0; i < stuReader.FieldCount; i++) { Response.Write("<td style='width:300px'>" + stuReader.GetName(i) + "</td>"); } Response.Write("</tr>"); // 输出记录 while (stuReader.Read()) { Response.Write("<tr>"); // 输出前面的信息 int j; for (j = 0; j < stuReader.FieldCount-1; j++) { Response.Write("<td style='height:30px;text-align:center'>" + stuReader.GetValue(j) + "</td>"); } /* 以下冲突报错 DataReader, // 从数据表Major获取专业名字,索引是stuReader.GetValue(j) int num = (int)stuReader.GetValue(j); //stuReader.Close(); cmd2.CommandText = "select MajorName from Major where MajorId = " + num; string majorName = (string)cmd2.ExecuteScalar(); Response.Write("<td>" + majorName + "</td>"); */ //stuReader.Open(); // 从数据库的数据表获取图片名字 string imageUrl = (string)stuReader.GetValue(j); // 输出图片 Response.Write("<td><img src='image/" + imageUrl + "'/></td>"); Response.Write("</tr>"); } Response.Write("</table>"); } catch(Exception ex) { Response.Write("失败:" + ex.Message); } finally { if(stuReader.IsClosed == false) stuReader.Close(); if(cnn.State == ConnectionState.Open) cnn.Close(); }在同一个连接对象cnn下,在使用了一个SqlCommand对象获取到的结果集合对象SqlDataReader的操作里面,再创建使用一个新的SqlCommand对象报错。不给用。。 原因是连接模式下,一次cnn.Open()和cnn.Close()之间只能执行一条cmd指令,想多次就需要多次开关