ホームページ >バックエンド開発 >C#.Net チュートリアル >ADO.NET はストアド プロシージャを呼び出します
1: 戻りパラメーターなしでストアド プロシージャを実行する (入力)
1: まず、addUser ストアド プロシージャを作成するなど、データベースにストアド プロシージャを書き込みます。
Proc を作成します addUser
@ID int,
@Name varchar(20),
@Sex varchar(20)
As
Users Values( @ID, @Name,@Sex ) に挿入
2: SqlCommand オブジェクトを作成します。そして、次のように SqlCommand オブジェクトを初期化します。
SqlCommand cmd = new SqlCommand( );
cmd.CommandText = "addUser"; // 呼び出すストアド プロシージャを指定します
cmd.CommandType = CommandType.StoredProcedure; // Sql コマンドの種類を指定します。ストアド プロシージャである場合、デフォルトは SQL ステートメントです。
cmd.Connection = con; // 接続を設定します
3: SqlCommand オブジェクトにストアド プロシージャ パラメーターを追加します
SqlParameter param = new SqlParameter( ); // パラメーター オブジェクトを定義します
param.ParameterName = "@ID";ストアド プロシージャ パラメータ名
param.Value = txtID.Text.Trim(); // このパラメータの値
cmd.Parameters.Add( param ); // SqlCommand オブジェクトがこのパラメータ オブジェクトを追加します
param = new SqlParameter( " @ Name", txtName.Text.Trim() ); // 略語
cmd.Parameters.Add( param );
4: SqlCommand オブジェクトは、Sql を実行する関数を呼び出します。例:
cmd.ExecuteNonQuery();
2: 戻りパラメーターを使用してストアド プロシージャを実行します (出力)
1: まず、queryUser ストアド プロシージャを作成するなど、データベースにストアド プロシージャを書き込みます。
alter Proc queryUser
@ID int,
@Suc varchar(10) Output
As
select @Suc= 'false'
if存在する( Select * From users where u_id = @ID )
select @Suc = 'success'
2: SqlCommand オブジェクトを作成し、次のように SqlCommand オブジェクトを初期化します。
SqlCommand cmd = new SqlCommand( );
cmd.CommandText = "queryUser"; //呼び出すストアド プロシージャを決定します
cmd.CommandType = CommandType.StoredProcedure; //決定 SQL コマンドのタイプはストアド プロシージャであり、デフォルトは SQL ステートメントです。
cmd.Connection = con; // 接続を設定します
3: SqlCommand オブジェクトにストアド プロシージャ パラメーターを追加します
SqlParameter param1 = new SqlParameter( "@ID", txtID.Text ) // 入力パラメーター
cmd.Parameters を追加します。 Add( param1 );
SqlParameter param2 = new SqlParameter(); // 出力パラメーターを追加します
param2.ParameterName = "@Suc"; // 出力パラメーターの名前
param2.SqlDbType = SqlDbType.VarChar; param2.Size = 10;//出力パラメータのSql型サイズ
param2.Direction = ParameterDirection.Output; //出力パラメータの型としてパラメータオブジェクトを指定
cmd.Parameters.Add( param2 );
cmd.ExecuteNonQuery();
MessageBox.Show( param2.Value.ToString() ); // 出力パラメーターの値を出力します
try
{
SqlCommand cmd = new SqlCommand ();
cmd.Connection = con;
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = "addUser";
SqlParameter param = new SqlParameter( );
param.ParameterName = "@ID ";
param .Value = txtID.Text.Trim();
cmd.Parameters.Add( param );
cmd.Parameters .Add( param );
param.ParameterName = "@Sex";
param.Value = txtSex.Text.Trim();
cmd.Parameters.Add( param );
if ( cmd.ExecuteNonQuery() == 1 )
{
MessageBox.Show( "正常に追加されました" );
}
else
{
MessageBox.Show("失敗しました");
}
}
catch( SqlException ex )
{
MessageBox.Show( ex.Message );
}
try
{
SqlCommand cmd = new SqlCommand( );
cmd。 CommandText = "queryUser ";
cmd.CommandType = CommandType.StoredProcedure;
cmd.Connection = con;
SqlParameter param1 = new SqlParameter( "@ID", txtID.Text );
cmd.Parameters.Add( param1 );
param2.ParameterName = "@Suc";
param2.SqlDbType = SqlDbType.VarChar;
param2.Size = 10;
param2.Direction = ParameterDirection.Output;
cmd.Parameters。 Add( param2 ) ;
cmd.ExecuteNonQuery();
MessageBox.Show( param1.Value.ToString() );
MessageBox.Show( param2.Value.ToString() );
catch( SqlException ex )
{
MessageBox.Show( ex.Message );
}
---------------- ----- --------------------------------------
SqlConnection dbconn = 新しい SqlConnection (connStr);
SqlCommand cmd = new SqlCommand("sp_uptmp",dbconn);
cmd.CommandType = CommandType.StoredProcedure;
SqlParameter srcPos = _cmd.パラメータ .Add("@srcPos",SqlDbType.VarChar);
SqlParameter rtnval = cmd.Parameters.Add("rval",SqlDbType.Int);
srcPos。方向 = ParameterDirection.Input ;
rtnval.Direction = ParameterDirection.ReturnValue;
tmpName.Value = "";
srcPos.Value = "";
dbconn.Open();
cmd.ExecuteNonQuery();
dbconn.Close();
tmpid = (int)rtnval.Value;戻り値は次のとおりです
次のようなストアド プロシージャがあると仮定します:
--------------------------------- - ----------
CREATE proc sp_uptmp @tmpName varchar(50),@srcPos varchar(255)
as
TRAN を開始
t_template 値(@tmpName,@srcPos) に挿入
COMMIT
return isnull(@@identity,0)
GO
------------------------------------- ----- ------------------------
ado.netで戻り値を取得するメソッドは(c#):
--- ------ -------------------------------------------- ------ -
SqlConnection dbconn = new SqlConnection(connStr);
SqlCommand cmd = new SqlCommand("sp_uptmp",dbconn);
cmd.CommandType = CommandType.StoredProcedure;
SqlParameter tmpName = cmd.Parameters.Add ("@tmpName", SqlDbType.VarChar);
SqlParameter srcPos = _cmd.Parameters.Add("@srcPos",SqlDbType.VarChar);
SqlParameter rtnval = cmd.Parameters.Add("rval",SqlDbType.Int);
tmpName.Direction = ParameterDirection.Input;
srcPos.Direction = ParameterDirection.Input;
rtnval.Direction = ParameterDirection.ReturnValue;
tmpName.Value = "";
srcPos.Value = "";
dbconn.Open( );
cmd.ExecuteNonQuery ();
dbconn.Close();
tmpid = (int)rtnval.Value; //これが戻り値です
ADO 環境では、ストアド プロシージャを呼び出すときの一般的な方法クエリ データは次のとおりです:
1 Connection Command オブジェクトを作成します
2 接続を開き、パラメータ名、データ型、および値を Command に割り当てます
3 Command オブジェクトを実行します
4 Recordset オブジェクトをクライアントに返します
このようにして、すべてのストアド プロシージャが呼び出されるときは、ストアド プロシージャ内のパラメータに従う必要があります。パラメータ オブジェクトを作成するデータ型
たとえば、ストアド プロシージャが 2 つのパラメータ @ID int、@Name varchar(10) を必要とする場合、
を作成する必要があります。パラメータ
cmd.Parameters.Append cmd.CreateParameter("@ID",adInteger,adParamInput,4)
cmd.Parameters.Append cmd.CreateParameter("@Name",adVarChar,adParamInput,10)
' に値を割り当てますパラメータ
cmd("@State") = 1
cmd("@WhereT")="2"
Every ストアド プロシージャを呼び出すときは、ストアド プロシージャのすべてのパラメータを手動で追加し、自分の知恵を使って確実にパラメーターのデータ型は、ストアド プロシージャ内のパラメーター情報と一致しています。
Command.Parameters オブジェクトには Refresh メソッドがあり、このメソッドの機能は、現在の Command オブジェクトに必要なすべてのパラメータの名前とデータ型を読み取ることです。このメソッドを使用すると、すべてのストアド プロシージャを呼び出す共通関数として記述することができます。これでこの関数は完成しました 結果セットを返すストアド プロシージャの一般的な関数。シンプルなので必要に応じて改良できます。
「Visual Basic 6.0 ではデバッグが成功しました。
Function GetRsByPro(strConnString As String, strProName As String, arjParameter() As String)
' クエリされたレコードセットを返します
' strConnString データ接続文字列
' strProName ストアド プロシージャ名
' ストアド プロシージャに必要な arjParameter() 配列
Onエラー GoTo errMsg
'ADO オブジェクトの作成
Dim Cmd As New Command
' ASP Con = Server.CreateObject("ADODB.Connection")
Dim Con As New Connection
' ASP Set Cmd = Server.CreateObject("ADODB.Command" )
Rsを新しいレコードセットとしてDim
' ASP Set rs = Server.CreateObject("ADODB.Recordset")
'データベースを開きます
Con.Open strConnString
Set Cmd.ActiveConnection = Con
Cmd.Commandtype = adCmdStoredProc
Cmd。パラメータ.Refresh
If UBound(arjParameter) <>Cmd.Parameters.Count then
Debug.Print "パラメータの数が正しくありません"
関数終了
'ストアド プロシージャ パラメータに値を代入します
For i = 0 To Cmd.Parameters .Count - 1
Cmd.Parameters(i).Value = arjParameter(i)
Next
'Recordset オブジェクトを設定
Rs.CursorType = 3
Rs.LockType = 3
Rs.CursorLocation = 3
Set Rs.Source = Cmd
Rs.Open
'結果セットを返す
Set GetRsByPro = Rs
'データソースを閉じる
Con.Close
Set Con = Nothing
errMsg:
Debug.Print Err.Description
関数終了
Dim Rs As New Recordset
StrConnString=””
StrProName=”pro_GetAllUser”
Dim arjParameter(1)
arjParameter(0)=”1”
arjParameter(1)=”山東省”
Set Rs= GetRsByPro(strConnString, strProName, arjParameter())
ADO.NET では、OleDbCommand.Parameters オブジェクトにも SqlCommand.Parameters オブジェクトにも、ストアド プロシージャのパラメーター情報を読み取るための Refresh メソッドがありません。同じ機能を実現するために、OleDbCommandBuilder クラスで DeriveParameters 静的メソッドが提供されます。
.NET SDK の DeriveParameters の説明
「SqlCommand で指定されたストアド プロシージャのパラメーター情報を使用して、指定された SqlCommand オブジェクトの Parameters コレクションを埋めます。」
SqlConnection Conn=new SqlConnection(cnString);
Conn.Open();
SqlCommand Comm=new SqlCommand();
Comm.Connection =conn;
Comm.CommandType =CommandType.StoredProcedure;
Comm.CommandText =proName;
SqlCommandBuilder.DeriveParameters(comm);
//このメソッドの後は、SqlCommand オブジェクトの SqlParameters オブジェクトがストアド プロシージャ内の情報を決定するのに役立ちます
ストアド プロシージャを実装し、DataSet オブジェクトを返すための特定の関数コードです
ファイル名: TestSqlAccess . cs
//
using System;
using System.Data;
using System.Xml;
using System.Data.SqlClient;
using System.Data.OleDb;
using System.Collections;
名前空間 Erp
{
パブリック シール クラス TestSqlAccess
{
#region ストアド プロシージャ パラメーター コレクションを取得します
public static SqlParameter [] getParameters(string cnString,string proName)
{
SqlConnection conn=new SqlConnection(cnString);
conn. Open( );
SqlCommand comm=new SqlCommand();
comm.Connection =conn;
comm.CommandType =CommandType.StoredProcedure;
comm.CommandText =proName;
SqlCommandBuilder.DeriveParameters(comm);
SqlParameter [] arPrm =new SqlParameter[comm.Parameters.Count];
for (int i=0;i
arPrm[i]=new SqlParameter();
arPrm[i].SqlDbType = comm.Parameters[i].SqlDbType;
arPrm[i].ParameterName=comm.Parameters[i].ParameterName;
arPrm[i].Size =comm.Parameters[i].Size;
}
return arPrm;
}
#endregion
#region Command オブジェクトを実行し、DataSet を返します
/////Microsoft が提供する SqlHelper クラスを呼び出すことができます...
#endregion Command オブジェクトを実行し、 DataSet を返す
DataReader を使用して行の合計を返す Parameters
DataReader オブジェクトを使用して、読み取り専用の前方専用データ ストリームを返すことができます。 DataReader に含まれる情報はストアド プロシージャから取得できます。この例では、DataReader オブジェクトを使用して入力パラメーターと出力パラメーターを指定してストアド プロシージャを実行し、返されたレコードを反復して戻りパラメーターを表示します。
1. Microsoft SQL Serverを実行しているサーバー上に次のストアドプロシージャを作成します: Create Procedure TestProcedure
(
@au_idIN varchar (11),
@numTitlesOUT Integer OUTPUT
)
AS
select A.名前, A.au_lname, T.title
from authors as A join titleauthor as TA on
A.au_id=TA.au_id
join tables as T
on T.title_id=TA.title_id
where A.au_id =@au_idIN
set @numTitlesOUT = @@Rowcount
return (5)
2. 新しい Visual C# .NET Windows アプリケーション プロジェクトを作成します。
3. System 名前空間と System.Data 名前空間に using ステートメントを使用すると、後続のコードでこれらの名前空間の宣言を修飾する必要がなくなります。このコードを「Forms」コード モジュールの先頭に追加します。選択したプロバイダーに対応するコードのみをコピーしてください。 SQL クライアント using System.Data.SqlClient;
OLE DB データ プロバイダー using System.Data.OleDb;
4. プライベート Form_Load イベントのコードを次のコードに置き換えます。 SQL クライアント SqlConnection PubsConn = new SqlConnection
( "データソース=サーバー;統合 " +
"セキュリティ=sspi;初期カタログ=pubs;");
SqlCommand testCMD = new SqlCommand
("TestProcedure", PubsConn);
testCMD.CommandType = CommandType.StoredProcedure ;
SqlParameter RetVal = testCMD.Parameters.Add
("RetVal", SqlDbType.Int);
RetVal.Direction = ParameterDirection.ReturnValue;
SqlParameter IdIn = testCMD.Parameters.Add
("@au_ idIN" , SqlDbType.VarChar, 11);
IdIn.Direction = ParameterDirection.Input;
SqlParameter NumTitles = testCMD.Parameters.Add
Titles.Direction = ParameterDirection .Output;
IdIn.Value = "213-46-8915" ;
PubsConn.Open();
SqlDataReader myReader = testCMD.ExecuteReader(); ;
.WriteLine("行数:" + NumTitles.Value );
Console.WriteLine("戻り値:" + RetVal.Value);
OLE DB データプロバイダー OleDbConnection PubsConn = new OleDbConnection
("Provider= SQLOLEDB;Data Source=server;" +
"integrated Security=sspi;initial category=pubs;");
OleDbCommand testCMD = new OleDbCommand
("TestProcedure", PubsConn);
testCMD.CommandType = CommandType.StoredProcedure;
OleDbParameter RetVal = testCMD.Parameters.Add
("RetVal", OleDbType.Integer);RetVal.Direction = ParameterDirection.ReturnValue;
OleDbParameter IdIn = testCMD.Parameters.Add
("@au_idIN", OleDbType.VarChar, 11);
IdIn.Direction = ParameterDirection.Input;
OleDbParameter NumTitles = testCMD.Parameters.Add
("@numtitlesout", OleDbType.VarChar, 11);
NumTitles.Direction = ParameterDirection.Output;
IdIn.Value = "213-46- 8915";
PubsConn.Open();
OleDbDataReader myReader = testCMD.ExecuteReader();
Console.WriteLine ("この著者の書籍タイトル:");
while (myReader.Read())
{
Console.WriteLine ("{0}", myReader.GetString (2));
};
myReader.Close();
Console.WriteLine("行数:" + NumTitles.Value ) ;
Console.WriteLine("Return Value:" + RetVal.Value);
5. SQL Server のコンピュータを実行するために、接続オブジェクトの接続文字列を変更します。注意、您必须DataReader を停止した場合、返されたパラメータを確認するためにすべての書き込みを実行する必要はないことに注意してください。