《数据库系统概论》课程学习(8)——第八章 数据库编程

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;
    }
}
发布了593 篇原创文章 · 获赞 34 · 访问量 9万+

猜你喜欢

转载自blog.csdn.net/qq_34573534/article/details/105132610