这周上完C#课程之后,觉得好难好难。课堂上就听的很糊涂。
事后花了2小时研究了一下代码,感觉其实还是不难的。 课堂上听的晕,大概是因为老师自己也不熟练这份代码,一直修改的缘故吧。
首先是 课堂上 老师 在 SQL Server 2005 中写的存储过程
他的原句是:
create proc sp_count
as
begin
select count(*) from Students
end
我照着打了一遍,结果我的 sql server 2008里提示错误。
翻了一遍《sql自学自用教程》后,重写了2个存储过程
通过变量 @ID 来显示ID对应的数据
CREATE procedure [dbo].[proc_student]
@ID int
AS
SELECT * FROM MM WHERE ID=@ID
————–
//统计数据的总数
CREATE proc [dbo].[proc_count]
as
SELECT COUNT(*) FROM MM
————–
重写的存储过程中不包含begin 和 end, 能顺利通过语法验证。我也不知道老师在课堂写的原版为什么能通过验证,版本问题?懒得管了,反正对sql没兴趣,能用就行了。
然后是在 C#中调用存储过程了。
private void button1_Click_1(object sender, EventArgs e)
{
string con = @"server=.;initial Catalog=Hello;integrated Security=True";//sql访问语句
string com = "proc_student";//定义存储过程名
SqlConnection conn = new SqlConnection(con);//申明sql连接
SqlCommand comm = new SqlCommand(com, conn);//申明sql指令
comm.CommandType = CommandType.StoredProcedure;//申明sql的指令格式为存储过程
conn.Open();
comm.Parameters.Add("@ID", SqlDbType.Int, 10);//定义参数 @ID 数据类型,长度
comm.Parameters["@ID"].Value = int.Parse(tid.Text.Trim());//给参数@ID 赋值
SqlDataReader sr = comm.ExecuteReader();//建立读取器,读取获取数据之后的结果
if (sr.Read())
{
tname.Text = sr["Sname"].ToString();
}
conn.Close();
}
假设以后开发程序中,要大量使用sql语句的话,sqlconnection,sqlcommand 要重复打很多遍,这样会无形中提高程序的体积和执行效率,所以决定通过调用一个专门连接数据库的类来节约代码量。又因为内部类不适合给多个程序调用,所以决定使用DLL动态链接库的方式。
创建一个 类库 ClassLibrary1
namespace ClassLibrary1
{
public class Class1
{
public static string con = @"server=.;initial Catalog=Hello;integrated Security=True";
public static int ExecnonQuery(string cmdtext, CommandType ct,SqlParameter[] param)
//申明一个带参数的方法(sql指令,sql指令类型,参数)
{
SqlConnection conn = new SqlConnection(con);
SqlCommand comm = new SqlCommand(cmdtext, conn);
comm.CommandType = ct;
if (param != null)//如果参数不为空
{
foreach (SqlParameter sp in param)
{
comm.Parameters.Add(sp);//将每个参数都添加进参数数组
}
}
try
{
conn.Open();
int i = int.Parse(comm.ExecuteScalar().ToString());//获取数据总数
conn.Close();
return i;//返回数据总数
}
catch (Exception ex)
{
throw ex;
}
finally
{
conn.Close();
}
}
}
}
//主程序调用DLL访问数据库
private void button2_Click(object sender, EventArgs e)
{
string cmdtext=("proc_count");//定义存储过程名
SqlParameter[] param = new SqlParameter[0];//定义参数数组,如果无参数就设为0
//param[0] = new SqlParameter("@ID", SqlDbType.Int, 10);//参数名,类型,大小
//param[0].Value = "1";
int i=ClassLibrary1.Class1.ExecnonQuery(cmdtext, CommandType.StoredProcedure, param);
//调用DLL,并将参数传递进去,并申明一个变量 i 来获得数据总数的返回值)
ttotal.Text = i.ToString();
}