T- SQL基本程序元素
自定义标量函数
自定义表值函数
游标
游标的声明
游标声明中的参数选项
游标的打开
游标数据的读取
游标数据读取示例
declare @s_no char(9), @s_name char(10)
declare @s_sex char(2), @s_age smallint, @s_dept char(20)
fetch next from cs_stu_cursor
into @s_no, @s_name, @s_sex, @s_age, @s_dept
while @@fetch_status = 0
begin
print @s_no
print @s_name
print @s_sex
print @s_age
print @s_dept
fetch next from cs_stu_cursor
into @s_no, @s_name, @s_sex, @s_age, @s_dept
end
游标的关闭与释放
用游标修改和删除基本表数据
用游标修改和删除基本表数据示例
declare cur_sc cursor for
select * from sc
for update of grade
open cur_sc
declare @s_no char(9), @c_no char(4), @grade smallint
fetch next from cur_sc into @s_no, @c_no, @grade
while @@fetch_status = 0
begin
if(@s_no = '1')
update sc set grade = 0 where current of cur_sc
if(@s_no = '2')
delete from sc where current of cur_sc
fetch next from cur_sc into @s_no, @c_no, @grade
end
close cur_sc
deallocate cur_sc
游标应用示例
问题:你还记得以前在Course关系删除数据时为了维护参照完整性所定义的触发器吗?若执行 delete from course where credit=2 会怎么样?
create trigger del_course
on course instead of delete
as begin
declare @del_cno char(4)
declare cur_del cursor for select cno from deleted
open cur_del
fetch next from cur_del into @del_cno
while @@fetch_status = 0
begin
update course set cpno = null where cpno = @del_cno
delete from course where cno = @del_cno
fetch next from cur_del into @del_cno
end
close cur_del
deallocate cur_del
end
游标变量
存储过程
存储过程:能够被调用执行的语句集合。独立于数据库表之外的数据库对象。其参数可被传入和传出,其出错代码可被检验。
1、存储过程的类型
- 系统存储过程:sp_为前缀。
- 用户自定义存储过程:本课学习的重点。
- 临时存储过程:与临时表类似,过程名前加#或##分别表示本地和全局。
- 扩展存储过程:可动态装载和执行的DLL。以xp_为前缀。
2、存储过程的功能特点
- 模块化编程:可独立于程序源代码来修改它们。
- 快速执行:当创建后得到了分析和优化,调用一次后将驻留内存。
- 减少网络通信量:执行时,客户端只需发出对存储过程的调用即可。
- 提供安全机制:存储过程可进行授权。
- 保证操作一致性:将重复操作编写成存储过程,可保持功能的一致性。
存储过程的创建
存储过程的创建与调用示例
存储过程的调用
存储过程的返回值
使用带字符串的exec命令
VC语言访问数据库的一种方法
#include <iostream>
#include <string>
using namespace std;
#import "c:\program files\common files\system\ado\msado15.dll“
no_namespace rename("EOF","rsEOF")
void main(void)
{
CoInitialize(NULL); /*ADO采用的是COM技术,使用必须初始化COM*/
_ConnectionPtr pCon(__uuidof(Connection));
_RecordsetPtr pRst(__uuidof(Recordset)); /*Recordset用来获取数据表内的数据*/
/*连接字符串,MYDB为数据库名,数据库采用的是Windows身份验证*/
pCon->ConnectionString = "Provider=SQLOLEDB.1;Integrated Security=SSPI;
Persist Security Info=False;Initial Catalog=MYDB;Data Source=.";
pCon->Open("","","",adConnectUnspecified);
_bstr_t SQL = "select * from student"; /*定义SQL命令串*/
pRst=pCon->Execute(SQL,NULL,adCmdText); /*使用Execute方法执行SQL语句*/
while(!pRst->rsEOF)
{
_variant_t var1 = pRst->GetCollect(“sno”); /*获取数据*/
_variant_t var2 = pRst->GetCollect("sname");
_variant_t var3 = pRst->GetCollect("ssex");
if(var1.vt != VT_NULL)
{
cout<<(LPCSTR)_bstr_t(var1)<<endl;
cout<<(LPCSTR)_bstr_t(var2)<<endl;
cout<<(LPCSTR)_bstr_t(var3)<<endl;
cout<<endl;
}
pRst->MoveNext(); /*下移读取下一个*/
}
//pCon->Execute("insert into student(sno,sname) values('12','ldh')",NULL,adCmdText);
//pCon->Execute("update student set ssex='M' where sno='12'",NULL,adCmdText);
//pCon->Execute("delete from student where sno='12'",NULL,adCmdText);
pRst->Close(); /*关闭记录集*/
pRst.Release(); /*释放智能指针*/
try //以下代码调用存储过程
{
_CommandPtr m_pCommand;
char cvar1[] = "1", cvar2[] = "2"; //两个存储过程输入型参数值
long cvar3 = 0; //存放存储过程输出型参数值
m_pCommand.CreateInstance(__uuidof(Command));
m_pCommand->ActiveConnection = pCon; //使用当前连接
m_pCommand->CommandType = adCmdStoredProc; //指定调用存储过程
m_pCommand->CommandText=_bstr_t("dbo.get_grade"); //指定存储过程名
_variant_t vvar1, vvar2, vvar3; //定义三个参数的变体类
vvar1 = _variant_t(_bstr_t(cvar1)); //初始化三个参数
vvar2 = _variant_t(_bstr_t(cvar2));
vvar3 = _variant_t(cvar3, VT_I4);
_ParameterPtr mp_var1, mp_var2, mp_var3; //创建每一个参数,并进行绑定。
mp_var1.CreateInstance(__uuidof(Parameter));
mp_var2.CreateInstance(__uuidof(Parameter));
mp_var3.CreateInstance(__uuidof(Parameter));
mp_var1 = m_pCommand->CreateParameter(_bstr_t("s_no"), adChar,
adParamInput, sizeof(vvar1), vvar1);
m_pCommand->Parameters->Append(mp_var1);
mp_var2 = m_pCommand->CreateParameter(_bstr_t("c_no"), adChar,
adParamInput, sizeof(vvar2), vvar2);
m_pCommand->Parameters->Append(mp_var2);
mp_var3 = m_pCommand->CreateParameter(_bstr_t("grade"), adInteger,
adParamOutput, sizeof(vvar3), vvar3);
m_pCommand->Parameters->Append(mp_var3);
m_pCommand->Execute(NULL, NULL, adCmdStoredProc); //调用存储过程
cvar3 = (long)mp_var3->Value; //获取存储过程返回的参数值
cout<<"Grade: "<<cvar3<<endl;
} catch(_com_error &error) { printf("\n%s\n", error.ErrorMessage()); }
pCon->Close(); /*关闭连接*/
pCon.Release(); /*释放智能指针*/
CoUninitialize(); /*释放COM;初始化COM用完后必须释放*/
return;
}
数据库连接串的获取
- 在桌面上新建一个文本文件,将其后缀改为.udl;
- 双击该文件(或点击右键选择属性),打开属性对话框;
- 在“提供程序”选项卡中选择所需程序(如选择SQL Server);
- 在“连接”选项卡中输入服务器名(或IP)、选择登录方式、再选择所需连接的数据库名称;
- 点击“测试连接”,测试成功后选择“确定”;
- 最后,以记事本打开所建立的.udl文件,即可看到连接串;
- 可将该连接串拷贝到程序中。
C#C/S访问数据库的一种方法
using System.Data;
using System.Data.OleDb;
namespace CSApp
{
public partial class Form1 : Form
{
public OleDbConnection dataConnection = new OleDbConnection();
public OleDbDataAdapter dataAdapter;
public DataSet dataSet = new DataSet();
public OleDbCommand command;
string connstr = @"Provider=SQLOLEDB.1;Integrated Security=SSPI;
Persist Security Info=False;Initial Catalog=MYDB;Data Source=.";
string sqlStr;
public DataSet GetDataFromDB(string sqlStr)
{
try {
dataConnection.ConnectionString = connstr;
dataAdapter = new OleDbDataAdapter(sqlStr, dataConnection);
dataSet.Reset();
dataAdapter.Fill(dataSet);
dataConnection.Close();
} catch (Exception ex) {
MessageBox.Show(ex.Message);
dataConnection.Close();
}
if (dataSet.Tables[0].Rows.Count != 0)
return dataSet;
else
return null;
}
public bool UpdateDB(string sqlStr)
{
try {
dataConnection.ConnectionString = connstr;
dataConnection.Open();
command = dataConnection.CreateCommand();
command.CommandText = sqlStr;
command.ExecuteNonQuery();
dataConnection.Close();
return true;
} catch (Exception ex) {
MessageBox.Show(ex.Message);
dataConnection.Close();
return false;
}
}
private void button1_Click(object sender, EventArgs e)
{
sqlStr = "select sname,sdept from student where sno='" +
textBox1.Text + "'";
DataSet ds = GetDataFromDB(sqlStr);
if (ds != null)
{
label4.Text = ds.Tables[0].Rows[0].ItemArray[0].ToString().Trim();
label8.Text = ds.Tables[0].Rows[0].ItemArray[1].ToString().Trim();
}
sqlStr = "select cname,grade from course,sc where course.cno=sc.cno
and sno='" + textBox1.Text + "'";
ds.Reset();
ds = GetDataFromDB(sqlStr);
if (ds != null)
dataGridView1.DataSource = ds.Tables[0];
}
private void button2_Click(object sender, EventArgs e)
{
sqlStr = "update student set sdept='" + textBox2.Text + " ' where
sno='" + textBox1.Text + "'";
UpdateDB(sqlStr);
}
private void button3_Click(object sender, EventArgs e)
{
sqlStr = "delete from sc where sno='" + textBox1.Text + "'";
UpdateDB(sqlStr);
sqlStr = "delete from student where sno='" + textBox1.Text + "'";
UpdateDB(sqlStr);
}
}
}
C#B/S访问数据库的一种方法
using System.Data.SqlClient;
public partial class _Default : System.Web.UI.Page
{
private DataSet GetDataFromDB(string sqlStr)
{
SqlConnection strcon = new
SqlConnection(ConfigurationManager.AppSettings["conStr"]);
DataSet ds = new DataSet();
try {
strcon.Open();
SqlDataAdapter sda = new SqlDataAdapter();
sda.SelectCommand = new SqlCommand(sqlStr, strcon);
sda.Fill(ds);
strcon.Close();
} catch (Exception ex) { strcon.Close(); }
return ds;
}
private bool UpdatDB(string sqlStr)
{
SqlConnection strcon = new
SqlConnection(ConfigurationManager.AppSettings["conStr"]);
try {
strcon.Open();
SqlCommand dbCommand = new SqlCommand(sqlStr, strcon);
dbCommand.ExecuteNonQuery();
strcon.Close();
}
catch (Exception ex)
{
strcon.Close();
return false;
}
return true;
}
protected void Button1_Click(object sender, EventArgs e)
{
string sqlstr = "select sname,sdept from student where sno='" +
TextBox1.Text + "'";
DataSet ds = GetDataFromDB(sqlstr);
Label2.Text = ds.Tables[0].Rows[0].ItemArray[0].ToString().Trim();
Label5.Text = ds.Tables[0].Rows[0].ItemArray[1].ToString().Trim();
sqlstr = "select cname,grade from course,sc where course.cno=sc.cno and
sno='" + TextBox1.Text + "'";
ds.Reset();
ds = GetDataFromDB(sqlstr);
GridView1.DataSource = ds.Tables[0];
GridView1.DataBind();
return;
}
protected void Button2_Click1(object sender, EventArgs e)
{
string sqlstr = "update student set sdept='" + TextBox2.Text + "' where
sno='" + TextBox1.Text + "'";
UpdatDB(sqlstr);
return;
}
protected void Button3_Click(object sender, EventArgs e)
{
string sqlstr = "delete from sc where sno='" + TextBox1.Text + "'";
UpdatDB(sqlstr);
sqlstr = "delete from student where sno='" + TextBox1.Text + "'";
UpdatDB(sqlstr);
return;
}
}