ADO.NET saklı bir yordam çağrısı geri dönüş değerlerini almak ve parametreler de dahil olmak üzere, çıktı için kullanılacak çeşitli yollar vardır:
DataAdapter veya DataSet bir nesneyi, döndürülen satırları toplamak ve bu satırlar çıkış parametreleri ve dönüş değerler ek olarak çalışmak için kullanın.
Bir DataReader nesnesi, bu satırlar arasında taşımak ve dönüş değerleri toplamak ve parametreleri çıkış döndürülen satırları toplamak için kullanın.
Sonuçları dönüş değerlerini ve çıkış parametreleri ilk satırın ilk sütundaki değeri geri dönmek için ExecuteScalar yöntemini kullanın. Bu toplama işlevleriyle kullanışlıdır.
Çıkış parametreleri ve dönüş değerleri geri dönmek için ExecuteNonQuery yöntemini kullanın. Iade edilen satırlar atılır. Bu eylem sorguları yürütmek için kullanışlıdır.
Bu makalede, son üç yöntemi gösterir ve SqlCommand hem OleDbCommand nesneleri kullanır. Kullanmakta olduğunuz yönetilen sağlayıcı için yalnızca kod kopyalama emin olun. Kullanmanız gereken hangi yönetilen sağlayıcı emin değilseniz, aşağıdaki Microsoft Developer Network Web sitesini ziyaret edin:
Her birinde, bu makaledeki örneklerde, Parametreler Command nesnesinin Parameters derlemesine eklenir. SQL Server .NET veri sağlayıcı (SqlClient) adlandırılmış parametreleri destekler. Bu nedenle, SqlCommand nesnesi kullandığınızda, Parametreler belirli herhangi bir sırada eklemeyin sahip, ancak parametreleri doğru adı olması gerekir. Bu durumda, eklemelisiniz (önek parametre adlarına @) işareti.
Alternatif olarak, OLE DB .NET veri sağlayıcı adlandırılmış parametreler desteklemiyor. Bu nedenle, OleDbCommand nesne kullandığınızda, (arka uç depolanan yordamı sırasında tanımlanan aynı sırada olan) doğru sırada parametrelerini eklemelisiniz. Bu durumda, "@" öneki için parametre adları eklemem gerekiyor ve saklı yordamın tanımlanan uyacak biçimde parametre adlarına sahip değilsiniz.
Satırlar ve parametreler iade için DataReader kullanın.
DataReader nesnesi, salt okunur, salt ileri veri akışı döndürmek için kullanabilirsiniz. DataReader içerdiği bilgiler, bir saklı yordam gelebilir. Bu örnek, DataReader nesnesi bir giriş ve bir çıkış parametresi vardır ve ardından iade parametrelerini görüntülemek için döndürülen kayıtlar arasında hareket saklı bir yordamı çalıştırmak için kullanır.
Pubs örnek veritabanında, Microsoft SQL Server çalıştıran bilgisayarda aşağıdaki saklı yordam oluştur:
Create Procedure TestProcedure
(
@au_idIN varchar (11),
@numTitlesOUT Integer OUTPUT
)
As
select A.au_fname, A.au_lname, T.title
from authors as A join titleauthor as TA on
A.au_id=TA.au_id
join titles as T
on T.title_id=TA.title_id
where A.au_id=@au_idIN
set @numTitlesOUT = @@Rowcount
return (5)
Microsoft Visual Studio. NET'i başlatın ve sonra yeni yönetilen C++ uygulama projesi, Visual C++ .NET ile oluşturun.
Solution Explorer'da, <a1>kaynak</a1> (.cpp) dosyasını çift tıklatın.
Kaynak dosyada varsayılan kodu aşağıdaki kodla değiştirin:
SQL istemcisi
Not<username>Kullanıcı KIMLIĞINI değiştirmeniz gerekir değeri ve parola, bu kodu çalıştırmadan önce = < güçlü parola > değeri için doğru değerler. Kullanıcı KIMLIĞI'in veritabanında bu işlemi gerçekleştirmek için uygun izinlere sahip olduğundan emin olun.
#include "stdafx.h"
#using <mscorlib.dll>
#include <tchar.h>
#using <system.dll>
using namespace System;
#using <system.data.dll>
using namespace System::Data;
using namespace System::Data::SqlClient;
// This is the entry point for this application.
int _tmain(void)
{
try{
SqlConnection *myCon = new SqlConnection("Data Source=mySQLServer;User ID=<username>;
Password=<strong password>;initial catalog=pubs;");
myCon->Open();
SqlCommand *myCmd = new SqlCommand("TestProcedure", myCon);
myCmd->CommandType = CommandType::StoredProcedure;
// Parameter order does not matter because SqlClient supports named
// parameters. Type the exact parameter names as declared in the
// stored procedure definition at the backend.
// Parameters should be prefixed with @.
myCmd->Parameters->Add("@au_idIN",SqlDbType::VarChar,11);
myCmd->Parameters->get_Item(0)->Value=S"213-46-8915";
SqlParameter *retParam;
retParam=myCmd->Parameters->Add("RetVal",SqlDbType::Int,4);
retParam->Direction=ParameterDirection::ReturnValue;
SqlParameter *outParam;
outParam=myCmd->Parameters->Add("@numTitlesOUT",SqlDbType::Int,4);
outParam->Direction=ParameterDirection::Output;
SqlDataReader *myReader;
myReader=myCmd->ExecuteReader();
while(myReader->Read())
{
for(int col=0;col<myReader->FieldCount;col++)
{
Console::Write("{0}: {1}",(myReader->GetName(col))->ToString(),
(myReader->GetValue(col))->ToString());
Console::WriteLine();
}
Console::WriteLine();
}
myReader->Close();
Console::WriteLine("Output Param:{0}; Return Value:{1}",
outParam->Value,retParam->Value);
myCon->Close();
}
catch(SqlException *mySqlEx)
{
for(int i=0;i<mySqlEx->Errors->Count;i++)
{
Console::WriteLine("Source={0};Message={1};",mySqlEx->Errors->
Item[i]->Source,mySqlEx->Errors->Item[i]->Message);
}
}
catch(System::Exception *ex)
{
Console::WriteLine(ex->get_Message());
}
}
OLE DB veri sağlayıcısı
#include "stdafx.h"
#using <mscorlib.dll>
#include <tchar.h>
#using <system.dll>
using namespace System;
#using <system.data.dll>
using namespace System::Data;
using namespace System::Data::OleDb;
// This is the entry point for this application.
int _tmain(void)
{
try{
OleDbConnection *myCon = new OleDbConnection("Provider=SQLOLEDB.1;
Data Source=mySQLServer;User ID=<username>;
Password=<strong password>;initial catalog=pubs;");
myCon->Open();
OleDbCommand *myCmd = new OleDbCommand("TestProcedure", myCon);
myCmd->CommandType = CommandType::StoredProcedure;
// The following notation also works. To test this notation,
// comment out the above two lines, and uncomment the next two lines.
// OleDbCommand *myCmd = new OleDbCommand("{?=call TestProcedure(?,?)}", myCon);
// myCmd->CommandType = CommandType::Text;
// The parameter order is important in this sample. Parameters are
// matched with stored procedure parameters in the order they are supplied.
// Names can be anything. You do not have to prefix them with "@".
OleDbParameter* retParam=myCmd->Parameters->Add("RetVal",OleDbType::Integer,4);
retParam->Direction=ParameterDirection::ReturnValue;
myCmd->Parameters->Add("au_idIN",OleDbType::VarChar,11);
myCmd->Parameters->Item[1]->Value=S"213-46-8915";
OleDbParameter *outParam=myCmd->Parameters->Add("numTitlesOUT",OleDbType::Integer,4);
outParam->Direction=ParameterDirection::Output;
OleDbDataReader *myReader;
myReader=myCmd->ExecuteReader();
int rowCnt=0;
while(myReader->Read())
{
for(int col=0;col<myReader->FieldCount;col++)
{
Console::Write("{0}: {1}",(myReader->GetName(col))->ToString(),
(myReader->GetValue(col))->ToString());
Console::WriteLine();
}
Console::WriteLine();
rowCnt++;
}
myReader->Close();
Console::WriteLine("Output Param:{0}; Return Value:{1}",outParam->
Value,retParam->Value);
myCon->Close();
}
catch(OleDbException *mySqlEx)
{
for(int i=0;i<mySqlEx->Errors->Count;i++)
{
Console::WriteLine("Source={0};Message={1};",mySqlEx->Errors->
Item[i]->Source,mySqlEx->Errors->Item[i]->Message);
}
}
catch(System::Exception *ex)
{
Console::WriteLine(ex->get_Message());
}
}
Bağlantı dizesini SQL çalıştıran bilgisayara gösterecek şekilde Connection nesnesine ilişkin değişiklik Server.
Projeyi derlemek ve CTRL + F5 tuş birleşimine basın. Output penceresi dönüş değeri, 5 ve <a1>Kayıt</a1> (2) sayısını içeren bir çıkış parametresi iki kitap başlıklarını görüntüler. Parametre değerleri görmek için DataReader kodda kapatmalısınız dikkat edin. Ayrıca, DataReader kapalıysa, dönüş parametrelerini görmek için tüm kayıtları taşımak zorunda unutmayın.
Parametre değerleri almak için Command nesnesinin ExecuteScalar yöntemini kullanabilirsiniz. Ayrıca, ExecuteScalar saklı yordamın ilk satırın ilk sütunu döndürür. Bu aşağıdaki örnekte olduğu gibi toplama işlevleri için kullanışlıdır.
SQL Server çalıştıran bilgisayarda aşağıdaki saklı yordamı oluştur:
Create Procedure TestProcedure2
(
@au_idIN varchar (11)
)
As
select count (T.title)
from authors as A join titleauthor as TA on
A.au_id=TA.au_id
join titles as T
on T.title_id=TA.title_id
where A.au_id=@au_idIN
Return(5)
Visual Studio. NET'i başlatın ve sonra yeni yönetilen C++, Visual C++ .NET uygulama proje.
Solution Explorer'da, <a1>kaynak</a1> (.cpp) dosyasını çift tıklatın.
Kaynak dosyada varsayılan kodu aşağıdaki kodla değiştirin:
SQL istemcisi
Not<username>Kullanıcı KIMLIĞINI değiştirmeniz gerekir değeri ve parola, bu kodu çalıştırmadan önce = < güçlü parola > değeri için doğru değerler. Kullanıcı KIMLIĞI'in veritabanında bu işlemi gerçekleştirmek için uygun izinlere sahip olduğundan emin olun.
#include "stdafx.h"
#using <mscorlib.dll>
#include <tchar.h>
#using <system.dll>
using namespace System;
#using <system.data.dll>
using namespace System::Data;
using namespace System::Data::SqlClient;
// This is the entry point for this application.
int _tmain(void)
{
try{
SqlConnection *myCon = new SqlConnection("Data Source=mySQLServer;User ID=<username>;
Password=<strong password>;initial catalog=pubs;");
myCon->Open();
SqlCommand *myCmd = new SqlCommand("TestProcedure2", myCon);
myCmd->CommandType = CommandType::StoredProcedure;
SqlParameter* retParam=myCmd->Parameters->Add("RetVal",SqlDbType::Int,4);
retParam->Direction=ParameterDirection::ReturnValue;
myCmd->Parameters->Add("@au_idIN",SqlDbType::VarChar,11);
myCmd->Parameters->Item[1]->Value=S"213-46-8915";
String *cnt;
cnt=myCmd->ExecuteScalar()->ToString();
Console::WriteLine("Cnt:{0}; Return Value:{1}",cnt,retParam->Value);
myCon->Close();
}
catch(SqlException *mySqlEx)
{
for(int i=0;i<mySqlEx->Errors->Count;i++)
{
Console::WriteLine("Source={0};Message={1};",mySqlEx->Errors->
Item[i]->Source,mySqlEx->Errors->Item[i]->Message);
}
}
catch(System::Exception *ex)
{
Console::WriteLine(ex->get_Message());
}
}
OLE DB veri sağlayıcısı
#include "stdafx.h"
#using <mscorlib.dll>
#include <tchar.h>
#using <system.dll>
using namespace System;
#using <system.data.dll>
using namespace System::Data;
using namespace System::Data::OleDb;
// This is the entry point for this application.
int _tmain(void)
{
try{
OleDbConnection *myCon = new OleDbConnection("Provider=SQLOLEDB.1;
Data Source=mySQLServer;User ID=<username>;
Password=<strong password>;initial catalog=pubs;");
myCon->Open();
OleDbCommand *myCmd = new OleDbCommand("{?=call TestProcedure2(?)}", myCon);
myCmd->CommandType = CommandType::Text;
OleDbParameter * retParam=myCmd->Parameters->Add("RetVal",OleDbType::Integer,4);
retParam->Direction=ParameterDirection::ReturnValue;
myCmd->Parameters->Add("au_idIN",OleDbType::VarChar,11);
myCmd->Parameters->Item[1]->Value=S"213-46-8915";
String *cnt;
cnt=myCmd->ExecuteScalar()->ToString();
Console::WriteLine("Count:{0}; Return Value:{1}",cnt,retParam->Value);
myCon->Close();
}
catch(OleDbException *mySqlEx)
{
for(int i=0;i<mySqlEx->Errors->Count;i++)
{
Console::WriteLine("Source={0};Message={1};",mySqlEx->Errors->
Item[i]->Source,mySqlEx->Errors->Item[i]->Message);
}
}
catch(System::Exception *ex)
{
Console::WriteLine(ex->get_Message());
}
}
Bağlantı dizesini SQL çalıştıran bilgisayara gösterecek şekilde Connection nesnesine ilişkin değişiklik Server.
Projeyi derlemek ve CTRL + F5 tuşuna basın. Çıktı penceresi yan? s?ra dönen değer (sayı) ilk satırın ilk sütunun değerini görüntüler.
Bu örnek, sorguyu çalıştırmak ve parametre değerlerini vermesini ExecuteNonQuery yöntemini kullanır. ExecuteNonQuery de sorgu çalıştıktan sonra etkilenen kayıtların sayısını verir. Ancak, ExecuteNonQuery herhangi bir satır veya sütun saklı yordamdan döndürmez.
ExecuteNonQuery yönteminin kaç satır değiştirilen bilmeniz yeterlidir, INSERT, UPDATE veya DELETE deyimleri kullandığınızda daha kullanışlıdır. Bir SELECT deyimi kullanıyorsunuz saklı yordamda sorgulamadan etkilenen satır için -1 alır.
SQL Server çalıştıran bilgisayarda aşağıdaki saklı yordamı oluştur:
Create Procedure TestProcedure3
(
@au_idIN varchar (11),
@au_fnam varchar (30)
)
As
Update authors set au_fname = @au_fnam
where au_id = @au_idin
return (5)
Visual Studio. NET'i başlatın ve sonra yeni yönetilen C++, Visual C++ .NET uygulama proje.
Solution Explorer'da, <a1>kaynak</a1> (.cpp) dosyasını çift tıklatın.
Kaynak dosyada varsayılan kodu aşağıdaki kodla değiştirin:
SQL istemcisi
Not<username>Kullanıcı KIMLIĞINI değiştirmeniz gerekir değeri ve parola, bu kodu çalıştırmadan önce = < güçlü parola > değeri için doğru değerler. Kullanıcı KIMLIĞI'in veritabanında bu işlemi gerçekleştirmek için uygun izinlere sahip olduğundan emin olun.
#include "stdafx.h"
#using <mscorlib.dll>
#include <tchar.h>
#using <system.dll>
using namespace System;
#using <system.data.dll>
using namespace System::Data;
using namespace System::Data::SqlClient;
// This is the entry point for this application.
int _tmain(void)
{
try{
SqlConnection *myCon = new SqlConnection("Data Source=mySQLServer;User ID=<username>;
Password=<strong password>;initial catalog=pubs;");
myCon->Open();
SqlCommand *myCmd = new SqlCommand("TestProcedure3", myCon);
myCmd->CommandType = CommandType::StoredProcedure;
SqlParameter* retParam=myCmd->Parameters->Add("RetVal",SqlDbType::Int,4);
retParam->Direction=ParameterDirection::ReturnValue;
myCmd->Parameters->Add("@au_idIN",SqlDbType::VarChar,11);
myCmd->Parameters->Item[1]->Value=S"213-46-8915";
myCmd->Parameters->Add("@au_fnam",SqlDbType::VarChar,30);
myCmd->Parameters->Item[2]->Value=S"Marjorie";
int cnt;
cnt=myCmd->ExecuteNonQuery();
Console::WriteLine("Number of rows affected:{0}; Return Value:{1}",
cnt.ToString(),retParam->Value);
myCon->Close();
}
catch(SqlException *mySqlEx)
{
for(int i=0;i<mySqlEx->Errors->Count;i++)
{
Console::WriteLine("Source={0};Message={1};",mySqlEx->Errors->
Item[i]->Source,mySqlEx->Errors->Item[i]->Message);
}
}
catch(System::Exception *ex)
{
Console::WriteLine(ex->get_Message());
}
}
OLE DB veri sağlayıcısı
#include "stdafx.h"
#using <mscorlib.dll>
#include <tchar.h>
#using <system.dll>
using namespace System;
#using <system.data.dll>
using namespace System::Data;
using namespace System::Data::OleDb;
// This is the entry point for this application.
int _tmain(void)
{
try{
OleDbConnection *myCon = new OleDbConnection("Provider=SQLOLEDB.1;
Data Source=mySQLServer;User ID=<username>;
Password=<strong password>;initial catalog=pubs;");
myCon->Open();
OleDbCommand *myCmd = new OleDbCommand("{?=call TestProcedure3(?,?)}", myCon);
myCmd->CommandType = CommandType::Text;
OleDbParameter *retParam=myCmd->Parameters->Add("RetVal",OleDbType::Integer,4);
retParam->Direction=ParameterDirection::ReturnValue;
myCmd->Parameters->Add("au_idIN",OleDbType::VarChar,11);
myCmd->Parameters->Item[1]->Value=S"213-46-8915";
myCmd->Parameters->Add("au_fnam",OleDbType::VarChar,30);
myCmd->Parameters->Item[2]->Value=S"Marjorie";
int cnt;
cnt=myCmd->ExecuteNonQuery();
Console::WriteLine("Number of rows affected:{0}; Return Value:{1}",
cnt.ToString(),retParam->Value);
myCon->Close();
}
catch(OleDbException *mySqlEx)
{
for(int i=0;i<mySqlEx->Errors->Count;i++)
{
Console::WriteLine("Source={0};Message={1};",mySqlEx->Errors->
Item[i]->Source,mySqlEx->Errors->Item[i]->Message);
}
}
catch(System::Exception *ex)
{
Console::WriteLine(ex->get_Message());
}
}
Bağlantı dizesini SQL çalıştıran bilgisayara gösterecek şekilde Connection nesnesine ilişkin değişiklik Server.
Projeyi derlemek ve CTRL + F5 tuşuna basın. Çıktı etkilenen (intRowAffected) bulunan satır sayısı ve dönüş parametresinin değeri penceresi görüntülenir.
ÖNEMLİ: Bu makale, bir kişi tarafından çevrilmek yerine, Microsoft makine-çevirisi yazılımı ile çevrilmiştir. Microsoft size hem kişiler tarafından çevrilmiş, hem de makine-çevrisi ile çevrilmiş makaleler sunar. Böylelikle, bilgi bankamızdaki tüm makalelere, kendi dilinizde ulaşmış olursunuz. Bununla birlikte, makine tarafından çevrilmiş makaleler mükemmel değildir. Bir yabancının sizin dilinizde konuşurken yapabileceği hatalar gibi, makale; kelime dağarcığı, söz dizim kuralları veya dil bilgisi açısından yanlışlar içerebilir. Microsoft, içeriğin yanlış çevrimi veya onun müşteri tarafından kullanımından doğan; kusur, hata veya zarardan sorumlu değildir. Microsoft ayrıca makine çevirisi yazılımını sıkça güncellemektedir.
Makalenin İngilizcesi aşağıdaki gibidir:310071
(http://support.microsoft.com/kb/310071/en-us/
)
Bu makaleyi kullanmak için ne kadar kişisel çaba harcadınız?
Çok az
Az
Orta
Fazla
Çok fazla
Bu bilgiyi geliştirmemiz için nedenleri ve bu konuda neler yapabileceğimizi paylaşın
Teşekkürler! Görüşleriniz, destek içeriğimizi geliştirmemize yardımcı olmak için kullanılmaktadır. Diğer yardım seçenekleri için, lütfen Yardım ve Destek Giriş Sayfasını ziyaret edin.