5 个解决方案
#1
1:添加OracleClient引用。
2:配置连接字符串 string connectString= "datasource=orcl,userid=zz,password=zz" zz自己更换
3:OracleConnection oc = new OracleConnection (connectString);
oc.Open()
2:配置连接字符串 string connectString= "datasource=orcl,userid=zz,password=zz" zz自己更换
3:OracleConnection oc = new OracleConnection (connectString);
oc.Open()
#2
一、使用OracleClient组件连接Oracle
.Net框架的System.Data.OracleClient.dll组件(ADO.Net组件),为连接和使用Oracle数据库提供了很大的方便。
1、使用客户端网络服务名连接Oracle
基于业务逻辑与数据库实体的分层需要,一般要求在不同于Oracle数据库主机的客户端机器连接和使用Oracle数据库。这种情况要么是通过C/S应用程序的客户端访问数据库的情况;要么是在B/S应用程序中,在WEB服务器端远程连接Oracle数据库服务器。
通过客户端网络服务名远程连接Oracle,要求在客户端机器中安装Oracle客户端工具(安装类型可以不必选择“管理员”模式,而只需要安装运行时支持即可,为应用程序提供基本的网络服务配置工具等)。
建立连接的语句比较简单,关键点为data source的设置。这里的data source不像SqlServer连接字串中指的是数据库名称,而是指客户端网络服务名(相关内容请参考前面有关客户端安装的文章)。对于本文的Oracle安装来说,data source对应着E:\Oracle_Client\oracle\ora92\network\admin\tnsnames.ora配置文件中的网络服务名(出于方便试验的原因,数据库与独立的客户端工具分别安装在了同一台机器的不同目录)。在具体实施连接时,将根据data source的值去该客户网络服务配置文件中查找对应项,以获取数据库服务器主机地址、端口、全局数据库名等连接信息。
建立连接的主要代码如下:
......
using System.Data.OracleClient;
......
//这里的“remotedb”对应于“Oracle客户端的安装与远程连接配置”一文中配置的客户端网络服务名
OracleConnection conn=
new OracleConnection("data source=remotedb;User Id=scott;Password=scott;");
conn.Open();
......
.Net框架的System.Data.OracleClient.dll组件(ADO.Net组件),为连接和使用Oracle数据库提供了很大的方便。
1、使用客户端网络服务名连接Oracle
基于业务逻辑与数据库实体的分层需要,一般要求在不同于Oracle数据库主机的客户端机器连接和使用Oracle数据库。这种情况要么是通过C/S应用程序的客户端访问数据库的情况;要么是在B/S应用程序中,在WEB服务器端远程连接Oracle数据库服务器。
通过客户端网络服务名远程连接Oracle,要求在客户端机器中安装Oracle客户端工具(安装类型可以不必选择“管理员”模式,而只需要安装运行时支持即可,为应用程序提供基本的网络服务配置工具等)。
建立连接的语句比较简单,关键点为data source的设置。这里的data source不像SqlServer连接字串中指的是数据库名称,而是指客户端网络服务名(相关内容请参考前面有关客户端安装的文章)。对于本文的Oracle安装来说,data source对应着E:\Oracle_Client\oracle\ora92\network\admin\tnsnames.ora配置文件中的网络服务名(出于方便试验的原因,数据库与独立的客户端工具分别安装在了同一台机器的不同目录)。在具体实施连接时,将根据data source的值去该客户网络服务配置文件中查找对应项,以获取数据库服务器主机地址、端口、全局数据库名等连接信息。
建立连接的主要代码如下:
......
using System.Data.OracleClient;
......
//这里的“remotedb”对应于“Oracle客户端的安装与远程连接配置”一文中配置的客户端网络服务名
OracleConnection conn=
new OracleConnection("data source=remotedb;User Id=scott;Password=scott;");
conn.Open();
......
#3
2、本地连接和使用Oracle
本地使用Oracle是指在安装Oracle数据库的主机中连接和使用Oracle数据库。从安全性和负载均衡的角度考虑,这种方式是不可取的。这里仅作为实验使用。
本地连接的代码与远程连接实际上没有什么分别,只不过其data source指向服务器端的客户网络服务名。对于本文的数据库安装,它指向E:\Oracle_Server\oracle\ora92\network\admin\tnsnames.ora文件中所定义的网络服务名(有关内容请参考“Oracle客户端的安装与远程连接配置”一文)。
对于这种本地连接方式,在服务器端不能存在独立安装的客户端工具,否则data source只会去匹配独立客户端的tnsnames.ora文件,即使找不到对应的网络服务名,也不会再去匹配服务器端的服务名。这不知是.Net组件的设计错误,还是故意为之,以鼓励远程连接和使用Oracle。
二、一个使用Oracle存储过程的简单登录验证程序
1、创建用户表
作为实验用表,用户表admin仅包含用户名和密码两个字段。创建表的SQL语句如下:
CREATE TABLE SCOTT.ADMIN ("NAME" VARCHAR2(20) NOT NULL,
"PASSWORD" VARCHAR2(20) NOT NULL) TABLESPACE "EXAMPLE"
2、创建验证用户登录的存储过程
CREATE OR REPLACE PROCEDURE "SCOTT"."P_LOGIN" (v_Name varchar2,
v_Password varchar2,b_Passed out char) as
n_Count number;
begin
select count(*) into n_Count from admin where name=v_Name and password=v_Password;
if n_Count > 0 then
b_Passed:='1';
else
b_Passed:='0';
end if;
end;
3、在Sql Plus等sql工具中使用PL/SQL测试存储过程是否可用:
set serveroutput on;
declare
v_Name varchar2(20);
v_password varchar(20);
b_Passed char(1);
begin
v_Name:='mxh';
v_Password:='mxh';
p_Login(v_Name,v_Password,b_Passed);
if b_Passed ='1' then
DBMS_OUTPUT.PUT_LINE('SUCCESS');
end if;
end;
4、创建一个登录窗口,实验C#对存储过程的调用:
(1)编写数据访问类,用于访问和操作数据库:
//DataAccess.cs
using System;
using System.Data;
using System.Data.OracleClient;
namespace OraLoginProcedure
{
public class DataAccess
{
private string connStr="data source=yourdb;User Id=scott;Password=scott;";
private OracleConnection conn=null;
public DataAccess()
{
}
public DataAccess(string strConnection)
{
this.connStr=strConnection;
}
public OracleConnection getConnection()
{
try
{
if(conn==null)
conn=new OracleConnection(connStr);
if(conn.State==ConnectionState.Open)
conn.Open();
return conn;
}
catch(OracleException e)
{
throw e;
}
}
public void closeConnection()
{
if(conn.State==ConnectionState.Open)
conn.Close();
}
//执行存储过程
public void RunProcedure(string storedProcName,OracleParameter[] parameters)
{
OracleCommand cmd=new OracleCommand(storedProcName,getConnection());
cmd.CommandType=CommandType.StoredProcedure;
foreach(OracleParameter parameter in parameters)
{
cmd.Parameters.Add(parameter);
}
cmd.ExecuteNonQuery();//执行存储过程
closeConnection();
}
//执行登录验证(在实际应用中应该把这种执行业务逻辑的代码与数据操作基础代码分离,以
//实现软件的清晰分层、增强代码的可复用性)
public bool Login(string username,string password)
{
OracleParameter[] parameters={
new OracleParameter("v_Name",OracleType.VarChar,20),
new OracleParameter("v_Password",OracleType.VarChar,20),
new OracleParameter("b_Passed",OracleType.Char,1)
};
parameters[0].Value=username;
parameters[1].Value=password;
parameters[0].Direction=ParameterDirection.Input;
parameters[1].Direction=ParameterDirection.Input;
parameters[2].Direction=ParameterDirection.Output;
try
{
RunProcedure("P_LOGIN",parameters);
if(parameters[2].Value.ToString() == "1")
return true;
else
return false;
}
catch(Exception e)
{
throw e;
}
}
}
}
(2)编写登录验证的界面程序:
//Form1.cs
......
using System.Data;
namespace OraLoginProcedure
{
public class Login : System.Windows.Forms.Form
{
private System.Windows.Forms.Button button1;//登录按钮
private System.Windows.Forms.TextBox textBox1;//用户名输入框
private System.Windows.Forms.TextBox textBox2;//密码输入框
private System.Windows.Forms.Label label1;
private System.Windows.Forms.Label label2;
......
public Login()
{
InitializeComponent();
}
......
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main()
{
Application.Run(new Login());
}
private void button1_Click(object sender, System.EventArgs e)
{
try
{
string username=textBox1.Text.Trim();
string password=textBox2.Text.Trim();
this.Close();//关闭界面后就读不到其中的控件输入了
DataAccess da=new DataAccess();
if(da.Login(username,password))
MessageBox.Show("Hello "+username);
else
MessageBox.Show("Login failed");
Application.Exit();
}
catch(Exception ex)
{
this.Close();
MessageBox.Show(ex.ToString());
Application.Exit();
}
}
}
}
本地使用Oracle是指在安装Oracle数据库的主机中连接和使用Oracle数据库。从安全性和负载均衡的角度考虑,这种方式是不可取的。这里仅作为实验使用。
本地连接的代码与远程连接实际上没有什么分别,只不过其data source指向服务器端的客户网络服务名。对于本文的数据库安装,它指向E:\Oracle_Server\oracle\ora92\network\admin\tnsnames.ora文件中所定义的网络服务名(有关内容请参考“Oracle客户端的安装与远程连接配置”一文)。
对于这种本地连接方式,在服务器端不能存在独立安装的客户端工具,否则data source只会去匹配独立客户端的tnsnames.ora文件,即使找不到对应的网络服务名,也不会再去匹配服务器端的服务名。这不知是.Net组件的设计错误,还是故意为之,以鼓励远程连接和使用Oracle。
二、一个使用Oracle存储过程的简单登录验证程序
1、创建用户表
作为实验用表,用户表admin仅包含用户名和密码两个字段。创建表的SQL语句如下:
CREATE TABLE SCOTT.ADMIN ("NAME" VARCHAR2(20) NOT NULL,
"PASSWORD" VARCHAR2(20) NOT NULL) TABLESPACE "EXAMPLE"
2、创建验证用户登录的存储过程
CREATE OR REPLACE PROCEDURE "SCOTT"."P_LOGIN" (v_Name varchar2,
v_Password varchar2,b_Passed out char) as
n_Count number;
begin
select count(*) into n_Count from admin where name=v_Name and password=v_Password;
if n_Count > 0 then
b_Passed:='1';
else
b_Passed:='0';
end if;
end;
3、在Sql Plus等sql工具中使用PL/SQL测试存储过程是否可用:
set serveroutput on;
declare
v_Name varchar2(20);
v_password varchar(20);
b_Passed char(1);
begin
v_Name:='mxh';
v_Password:='mxh';
p_Login(v_Name,v_Password,b_Passed);
if b_Passed ='1' then
DBMS_OUTPUT.PUT_LINE('SUCCESS');
end if;
end;
4、创建一个登录窗口,实验C#对存储过程的调用:
(1)编写数据访问类,用于访问和操作数据库:
//DataAccess.cs
using System;
using System.Data;
using System.Data.OracleClient;
namespace OraLoginProcedure
{
public class DataAccess
{
private string connStr="data source=yourdb;User Id=scott;Password=scott;";
private OracleConnection conn=null;
public DataAccess()
{
}
public DataAccess(string strConnection)
{
this.connStr=strConnection;
}
public OracleConnection getConnection()
{
try
{
if(conn==null)
conn=new OracleConnection(connStr);
if(conn.State==ConnectionState.Open)
conn.Open();
return conn;
}
catch(OracleException e)
{
throw e;
}
}
public void closeConnection()
{
if(conn.State==ConnectionState.Open)
conn.Close();
}
//执行存储过程
public void RunProcedure(string storedProcName,OracleParameter[] parameters)
{
OracleCommand cmd=new OracleCommand(storedProcName,getConnection());
cmd.CommandType=CommandType.StoredProcedure;
foreach(OracleParameter parameter in parameters)
{
cmd.Parameters.Add(parameter);
}
cmd.ExecuteNonQuery();//执行存储过程
closeConnection();
}
//执行登录验证(在实际应用中应该把这种执行业务逻辑的代码与数据操作基础代码分离,以
//实现软件的清晰分层、增强代码的可复用性)
public bool Login(string username,string password)
{
OracleParameter[] parameters={
new OracleParameter("v_Name",OracleType.VarChar,20),
new OracleParameter("v_Password",OracleType.VarChar,20),
new OracleParameter("b_Passed",OracleType.Char,1)
};
parameters[0].Value=username;
parameters[1].Value=password;
parameters[0].Direction=ParameterDirection.Input;
parameters[1].Direction=ParameterDirection.Input;
parameters[2].Direction=ParameterDirection.Output;
try
{
RunProcedure("P_LOGIN",parameters);
if(parameters[2].Value.ToString() == "1")
return true;
else
return false;
}
catch(Exception e)
{
throw e;
}
}
}
}
(2)编写登录验证的界面程序:
//Form1.cs
......
using System.Data;
namespace OraLoginProcedure
{
public class Login : System.Windows.Forms.Form
{
private System.Windows.Forms.Button button1;//登录按钮
private System.Windows.Forms.TextBox textBox1;//用户名输入框
private System.Windows.Forms.TextBox textBox2;//密码输入框
private System.Windows.Forms.Label label1;
private System.Windows.Forms.Label label2;
......
public Login()
{
InitializeComponent();
}
......
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main()
{
Application.Run(new Login());
}
private void button1_Click(object sender, System.EventArgs e)
{
try
{
string username=textBox1.Text.Trim();
string password=textBox2.Text.Trim();
this.Close();//关闭界面后就读不到其中的控件输入了
DataAccess da=new DataAccess();
if(da.Login(username,password))
MessageBox.Show("Hello "+username);
else
MessageBox.Show("Login failed");
Application.Exit();
}
catch(Exception ex)
{
this.Close();
MessageBox.Show(ex.ToString());
Application.Exit();
}
}
}
}
#4
第三步在Sql Plus等sql工具中使用PL/SQL测试存储过程是否可用,我的会报错如下,新手不懂,请问这是为什么?谢谢!
第 8 行出现错误:
ORA-06550: 第 8 行, 第 7 列:
PLS-00201: 必须声明标识符 'P_LOGIN'
ORA-06550: 第 8 行, 第 7 列:
PL/SQL: Statement ignored
#5
P_LOGIN 是存储过程的名字
#1
1:添加OracleClient引用。
2:配置连接字符串 string connectString= "datasource=orcl,userid=zz,password=zz" zz自己更换
3:OracleConnection oc = new OracleConnection (connectString);
oc.Open()
2:配置连接字符串 string connectString= "datasource=orcl,userid=zz,password=zz" zz自己更换
3:OracleConnection oc = new OracleConnection (connectString);
oc.Open()
#2
一、使用OracleClient组件连接Oracle
.Net框架的System.Data.OracleClient.dll组件(ADO.Net组件),为连接和使用Oracle数据库提供了很大的方便。
1、使用客户端网络服务名连接Oracle
基于业务逻辑与数据库实体的分层需要,一般要求在不同于Oracle数据库主机的客户端机器连接和使用Oracle数据库。这种情况要么是通过C/S应用程序的客户端访问数据库的情况;要么是在B/S应用程序中,在WEB服务器端远程连接Oracle数据库服务器。
通过客户端网络服务名远程连接Oracle,要求在客户端机器中安装Oracle客户端工具(安装类型可以不必选择“管理员”模式,而只需要安装运行时支持即可,为应用程序提供基本的网络服务配置工具等)。
建立连接的语句比较简单,关键点为data source的设置。这里的data source不像SqlServer连接字串中指的是数据库名称,而是指客户端网络服务名(相关内容请参考前面有关客户端安装的文章)。对于本文的Oracle安装来说,data source对应着E:\Oracle_Client\oracle\ora92\network\admin\tnsnames.ora配置文件中的网络服务名(出于方便试验的原因,数据库与独立的客户端工具分别安装在了同一台机器的不同目录)。在具体实施连接时,将根据data source的值去该客户网络服务配置文件中查找对应项,以获取数据库服务器主机地址、端口、全局数据库名等连接信息。
建立连接的主要代码如下:
......
using System.Data.OracleClient;
......
//这里的“remotedb”对应于“Oracle客户端的安装与远程连接配置”一文中配置的客户端网络服务名
OracleConnection conn=
new OracleConnection("data source=remotedb;User Id=scott;Password=scott;");
conn.Open();
......
.Net框架的System.Data.OracleClient.dll组件(ADO.Net组件),为连接和使用Oracle数据库提供了很大的方便。
1、使用客户端网络服务名连接Oracle
基于业务逻辑与数据库实体的分层需要,一般要求在不同于Oracle数据库主机的客户端机器连接和使用Oracle数据库。这种情况要么是通过C/S应用程序的客户端访问数据库的情况;要么是在B/S应用程序中,在WEB服务器端远程连接Oracle数据库服务器。
通过客户端网络服务名远程连接Oracle,要求在客户端机器中安装Oracle客户端工具(安装类型可以不必选择“管理员”模式,而只需要安装运行时支持即可,为应用程序提供基本的网络服务配置工具等)。
建立连接的语句比较简单,关键点为data source的设置。这里的data source不像SqlServer连接字串中指的是数据库名称,而是指客户端网络服务名(相关内容请参考前面有关客户端安装的文章)。对于本文的Oracle安装来说,data source对应着E:\Oracle_Client\oracle\ora92\network\admin\tnsnames.ora配置文件中的网络服务名(出于方便试验的原因,数据库与独立的客户端工具分别安装在了同一台机器的不同目录)。在具体实施连接时,将根据data source的值去该客户网络服务配置文件中查找对应项,以获取数据库服务器主机地址、端口、全局数据库名等连接信息。
建立连接的主要代码如下:
......
using System.Data.OracleClient;
......
//这里的“remotedb”对应于“Oracle客户端的安装与远程连接配置”一文中配置的客户端网络服务名
OracleConnection conn=
new OracleConnection("data source=remotedb;User Id=scott;Password=scott;");
conn.Open();
......
#3
2、本地连接和使用Oracle
本地使用Oracle是指在安装Oracle数据库的主机中连接和使用Oracle数据库。从安全性和负载均衡的角度考虑,这种方式是不可取的。这里仅作为实验使用。
本地连接的代码与远程连接实际上没有什么分别,只不过其data source指向服务器端的客户网络服务名。对于本文的数据库安装,它指向E:\Oracle_Server\oracle\ora92\network\admin\tnsnames.ora文件中所定义的网络服务名(有关内容请参考“Oracle客户端的安装与远程连接配置”一文)。
对于这种本地连接方式,在服务器端不能存在独立安装的客户端工具,否则data source只会去匹配独立客户端的tnsnames.ora文件,即使找不到对应的网络服务名,也不会再去匹配服务器端的服务名。这不知是.Net组件的设计错误,还是故意为之,以鼓励远程连接和使用Oracle。
二、一个使用Oracle存储过程的简单登录验证程序
1、创建用户表
作为实验用表,用户表admin仅包含用户名和密码两个字段。创建表的SQL语句如下:
CREATE TABLE SCOTT.ADMIN ("NAME" VARCHAR2(20) NOT NULL,
"PASSWORD" VARCHAR2(20) NOT NULL) TABLESPACE "EXAMPLE"
2、创建验证用户登录的存储过程
CREATE OR REPLACE PROCEDURE "SCOTT"."P_LOGIN" (v_Name varchar2,
v_Password varchar2,b_Passed out char) as
n_Count number;
begin
select count(*) into n_Count from admin where name=v_Name and password=v_Password;
if n_Count > 0 then
b_Passed:='1';
else
b_Passed:='0';
end if;
end;
3、在Sql Plus等sql工具中使用PL/SQL测试存储过程是否可用:
set serveroutput on;
declare
v_Name varchar2(20);
v_password varchar(20);
b_Passed char(1);
begin
v_Name:='mxh';
v_Password:='mxh';
p_Login(v_Name,v_Password,b_Passed);
if b_Passed ='1' then
DBMS_OUTPUT.PUT_LINE('SUCCESS');
end if;
end;
4、创建一个登录窗口,实验C#对存储过程的调用:
(1)编写数据访问类,用于访问和操作数据库:
//DataAccess.cs
using System;
using System.Data;
using System.Data.OracleClient;
namespace OraLoginProcedure
{
public class DataAccess
{
private string connStr="data source=yourdb;User Id=scott;Password=scott;";
private OracleConnection conn=null;
public DataAccess()
{
}
public DataAccess(string strConnection)
{
this.connStr=strConnection;
}
public OracleConnection getConnection()
{
try
{
if(conn==null)
conn=new OracleConnection(connStr);
if(conn.State==ConnectionState.Open)
conn.Open();
return conn;
}
catch(OracleException e)
{
throw e;
}
}
public void closeConnection()
{
if(conn.State==ConnectionState.Open)
conn.Close();
}
//执行存储过程
public void RunProcedure(string storedProcName,OracleParameter[] parameters)
{
OracleCommand cmd=new OracleCommand(storedProcName,getConnection());
cmd.CommandType=CommandType.StoredProcedure;
foreach(OracleParameter parameter in parameters)
{
cmd.Parameters.Add(parameter);
}
cmd.ExecuteNonQuery();//执行存储过程
closeConnection();
}
//执行登录验证(在实际应用中应该把这种执行业务逻辑的代码与数据操作基础代码分离,以
//实现软件的清晰分层、增强代码的可复用性)
public bool Login(string username,string password)
{
OracleParameter[] parameters={
new OracleParameter("v_Name",OracleType.VarChar,20),
new OracleParameter("v_Password",OracleType.VarChar,20),
new OracleParameter("b_Passed",OracleType.Char,1)
};
parameters[0].Value=username;
parameters[1].Value=password;
parameters[0].Direction=ParameterDirection.Input;
parameters[1].Direction=ParameterDirection.Input;
parameters[2].Direction=ParameterDirection.Output;
try
{
RunProcedure("P_LOGIN",parameters);
if(parameters[2].Value.ToString() == "1")
return true;
else
return false;
}
catch(Exception e)
{
throw e;
}
}
}
}
(2)编写登录验证的界面程序:
//Form1.cs
......
using System.Data;
namespace OraLoginProcedure
{
public class Login : System.Windows.Forms.Form
{
private System.Windows.Forms.Button button1;//登录按钮
private System.Windows.Forms.TextBox textBox1;//用户名输入框
private System.Windows.Forms.TextBox textBox2;//密码输入框
private System.Windows.Forms.Label label1;
private System.Windows.Forms.Label label2;
......
public Login()
{
InitializeComponent();
}
......
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main()
{
Application.Run(new Login());
}
private void button1_Click(object sender, System.EventArgs e)
{
try
{
string username=textBox1.Text.Trim();
string password=textBox2.Text.Trim();
this.Close();//关闭界面后就读不到其中的控件输入了
DataAccess da=new DataAccess();
if(da.Login(username,password))
MessageBox.Show("Hello "+username);
else
MessageBox.Show("Login failed");
Application.Exit();
}
catch(Exception ex)
{
this.Close();
MessageBox.Show(ex.ToString());
Application.Exit();
}
}
}
}
本地使用Oracle是指在安装Oracle数据库的主机中连接和使用Oracle数据库。从安全性和负载均衡的角度考虑,这种方式是不可取的。这里仅作为实验使用。
本地连接的代码与远程连接实际上没有什么分别,只不过其data source指向服务器端的客户网络服务名。对于本文的数据库安装,它指向E:\Oracle_Server\oracle\ora92\network\admin\tnsnames.ora文件中所定义的网络服务名(有关内容请参考“Oracle客户端的安装与远程连接配置”一文)。
对于这种本地连接方式,在服务器端不能存在独立安装的客户端工具,否则data source只会去匹配独立客户端的tnsnames.ora文件,即使找不到对应的网络服务名,也不会再去匹配服务器端的服务名。这不知是.Net组件的设计错误,还是故意为之,以鼓励远程连接和使用Oracle。
二、一个使用Oracle存储过程的简单登录验证程序
1、创建用户表
作为实验用表,用户表admin仅包含用户名和密码两个字段。创建表的SQL语句如下:
CREATE TABLE SCOTT.ADMIN ("NAME" VARCHAR2(20) NOT NULL,
"PASSWORD" VARCHAR2(20) NOT NULL) TABLESPACE "EXAMPLE"
2、创建验证用户登录的存储过程
CREATE OR REPLACE PROCEDURE "SCOTT"."P_LOGIN" (v_Name varchar2,
v_Password varchar2,b_Passed out char) as
n_Count number;
begin
select count(*) into n_Count from admin where name=v_Name and password=v_Password;
if n_Count > 0 then
b_Passed:='1';
else
b_Passed:='0';
end if;
end;
3、在Sql Plus等sql工具中使用PL/SQL测试存储过程是否可用:
set serveroutput on;
declare
v_Name varchar2(20);
v_password varchar(20);
b_Passed char(1);
begin
v_Name:='mxh';
v_Password:='mxh';
p_Login(v_Name,v_Password,b_Passed);
if b_Passed ='1' then
DBMS_OUTPUT.PUT_LINE('SUCCESS');
end if;
end;
4、创建一个登录窗口,实验C#对存储过程的调用:
(1)编写数据访问类,用于访问和操作数据库:
//DataAccess.cs
using System;
using System.Data;
using System.Data.OracleClient;
namespace OraLoginProcedure
{
public class DataAccess
{
private string connStr="data source=yourdb;User Id=scott;Password=scott;";
private OracleConnection conn=null;
public DataAccess()
{
}
public DataAccess(string strConnection)
{
this.connStr=strConnection;
}
public OracleConnection getConnection()
{
try
{
if(conn==null)
conn=new OracleConnection(connStr);
if(conn.State==ConnectionState.Open)
conn.Open();
return conn;
}
catch(OracleException e)
{
throw e;
}
}
public void closeConnection()
{
if(conn.State==ConnectionState.Open)
conn.Close();
}
//执行存储过程
public void RunProcedure(string storedProcName,OracleParameter[] parameters)
{
OracleCommand cmd=new OracleCommand(storedProcName,getConnection());
cmd.CommandType=CommandType.StoredProcedure;
foreach(OracleParameter parameter in parameters)
{
cmd.Parameters.Add(parameter);
}
cmd.ExecuteNonQuery();//执行存储过程
closeConnection();
}
//执行登录验证(在实际应用中应该把这种执行业务逻辑的代码与数据操作基础代码分离,以
//实现软件的清晰分层、增强代码的可复用性)
public bool Login(string username,string password)
{
OracleParameter[] parameters={
new OracleParameter("v_Name",OracleType.VarChar,20),
new OracleParameter("v_Password",OracleType.VarChar,20),
new OracleParameter("b_Passed",OracleType.Char,1)
};
parameters[0].Value=username;
parameters[1].Value=password;
parameters[0].Direction=ParameterDirection.Input;
parameters[1].Direction=ParameterDirection.Input;
parameters[2].Direction=ParameterDirection.Output;
try
{
RunProcedure("P_LOGIN",parameters);
if(parameters[2].Value.ToString() == "1")
return true;
else
return false;
}
catch(Exception e)
{
throw e;
}
}
}
}
(2)编写登录验证的界面程序:
//Form1.cs
......
using System.Data;
namespace OraLoginProcedure
{
public class Login : System.Windows.Forms.Form
{
private System.Windows.Forms.Button button1;//登录按钮
private System.Windows.Forms.TextBox textBox1;//用户名输入框
private System.Windows.Forms.TextBox textBox2;//密码输入框
private System.Windows.Forms.Label label1;
private System.Windows.Forms.Label label2;
......
public Login()
{
InitializeComponent();
}
......
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main()
{
Application.Run(new Login());
}
private void button1_Click(object sender, System.EventArgs e)
{
try
{
string username=textBox1.Text.Trim();
string password=textBox2.Text.Trim();
this.Close();//关闭界面后就读不到其中的控件输入了
DataAccess da=new DataAccess();
if(da.Login(username,password))
MessageBox.Show("Hello "+username);
else
MessageBox.Show("Login failed");
Application.Exit();
}
catch(Exception ex)
{
this.Close();
MessageBox.Show(ex.ToString());
Application.Exit();
}
}
}
}
#4
第三步在Sql Plus等sql工具中使用PL/SQL测试存储过程是否可用,我的会报错如下,新手不懂,请问这是为什么?谢谢!
第 8 行出现错误:
ORA-06550: 第 8 行, 第 7 列:
PLS-00201: 必须声明标识符 'P_LOGIN'
ORA-06550: 第 8 行, 第 7 列:
PL/SQL: Statement ignored
#5
P_LOGIN 是存储过程的名字