PDA

View Full Version : vấn đề về StoredProcedure trong C# | help me @@!



congchinhqn
10-01-2010, 10:00 PM
mình chưa hiểu StoredProcedure đc tạo trong SQL hay trong C#
và nó đc sử dụng như thế nào?
có code mẫu càng tốt thank nhé!

ChuotNhat3k
10-01-2010, 11:34 PM
mình chưa hiểu StoredProcedure đc tạo trong SQL hay trong C#
và nó đc sử dụng như thế nào?
có code mẫu càng tốt thank nhé!
Stored Procedure là những dữ liệu được trích xuất từ bằng query trong sql. Nếu bạn đã từng sử dụng Access thì có thể thấy nó giống như các Query của Access. Cái này bạn phải tạo trực tiếp trong sql và dùng C# để khai thác dữ liệu từ nó

iCarrot
11-01-2010, 12:04 AM
Stored Procedure sao lại là dữ liệu được hả bạn :-s

Nói đơn giản thì Stored Procedure giống như procedure (hay function với kiểu trả về void) trong các ngôn ngữ lập trình vậy, nó nhận các đối số và thực hiện các câu lệnh sql nằm trong thân procedure. Bản thân procedure thì không trả về gì cả, nhưng kết quả các phép select bên trong nó có thể lấy ra được với ADO.Net như bình thường.

Lợi thế của việc sử dụng Stored Procedure là đoạn sql đã được dịch sẵn, khi gọi chỉ việc chạy chứ không cần dịch rồi mới chạy.

congchinhqn
11-01-2010, 12:12 AM
theo mình tìm hiểu thì stored procedure có thể hiểu nôm na như thế này" nó là 1 hàm chứa các câu lệnh SQL " ( theo ý mình )
kòn nếu muốn tạo stored procedure thì vẫn có thể tạo trên SQL sever hoặc trong C# vẫn tích hợp ứng dụng để tạo stored procedure,view,functions,...
và cho mình hỏi cách gọi stored procedure trong C# như thế nào?
mình kòn mơ hồ về vấn đề này

iCarrot
11-01-2010, 12:19 AM
Giống hệt như cách bạn chạy các lệnh sql khác.

Chẳng hạn không kết quả trả về thì Execute.

Có kết quả trả về (từ các query bên trong) thì ExecuteQuery.

Lệnh sql để chạy stored procedure thì bạn tham khảo tài liệu sql.

congchinhqn
11-01-2010, 01:26 PM
sau thời gian ngâm kíu và mình hiểu như thế này
lúc đầu mình tạo Class có tên là: SqlHelper.cs
nhiệm vụ của class này là :
1 - thực hiện kết nối và đổ dữ liệu vào dataset
2 - kết nối và thực hiện lệnh SQL

using System;
using System.Data.SqlClient;
using System.Data;

namespace hotel_management
{
public class SqlHelper
{
public static string chuoikn = @"Data Source=.\SQLEXPRESS;AttachDbFilename=C:\Documents and Settings\Admin\My Documents\Visual Studio 2005\Projects\hotel_management\hotel_management\ho tel_management\Hotels.mdf;Integrated Security=True;User Instance=True";

public SqlHelper()
{
//
// Constructor
//
}

/// <summary>
///
/// </summary>
/// <param name="connectionString">The connection string: data source=...;database=...;</param>
public SqlHelper(String chuoikn)
{
SqlHelper.chuoikn = chuoikn;
}

/// <summary>
/// Execute a query string or a store procedure
/// </summary>
/// <param name="sql">Query string or store procedure name</param>
/// <param name="commandType">Execute type: query string or store procedure</param>
/// <param name="pars">Parameters for store procedure</param>
/// <returns>DataTable</returns>
public static DataTable ExecuteQuery(
string sql,
CommandType commandType,
params object[] pars)
{
SqlConnection ketnoi = new SqlConnection(chuoikn);
ketnoi.Open();

SqlCommand lenhsql = new SqlCommand(sql, ketnoi);
lenhsql.CommandType = commandType;

for (int i = 0; i < pars.Length; i += 2)
{
SqlParameter par = new SqlParameter(pars[i].ToString(), pars[i + 1]);
lenhsql.Parameters.Add(par);
}

SqlDataAdapter data = new SqlDataAdapter(lenhsql);
DataSet dulieu = new DataSet();
data.Fill(dulieu);
ketnoi.Close();
return dulieu.Tables[0];
}

/// <summary>
/// Execute a query string or a store procedure
/// </summary>
/// <param name="sql">Query string or store procedure name</param>
/// <param name="commandType">Execute type: query string or store procedure</param>
/// <param name="pars">Parameters for store procedure</param>
public static void ExecuteNonQuery(
string sql,
CommandType commandType,
params object[] pars)
{
SqlConnection ketnoi = new SqlConnection(chuoikn);
ketnoi.Open();

SqlCommand lenhsql = new SqlCommand(sql, ketnoi);
lenhsql.CommandType = commandType;

for (int i = 0; i < pars.Length; i += 2)
{
SqlParameter par = new SqlParameter(pars[i].ToString(), pars[i + 1]);
lenhsql.Parameters.Add(par);
}

lenhsql.ExecuteNonQuery();
ketnoi.Close();
}
}
}

và bây giờ mình gọi cái class ra như sau :
1 - kết nối vào đổ dữ liệu vào dataset :

DataTable bang_phong = SqlHelper.ExecuteQuery(
"ds_phong",
CommandType.StoredProcedure);
2 - kết nối và thực hiện lênh SQL :

SqlHelper.ExecuteNonQuery(
"insert_Phong",
CommandType.StoredProcedure,
"@option", option,
"@MAPHONG", txt_maphong.Text.Trim(),
"@MALOAIPHONG", comboBox_loaiphong.SelectedValue,
"@TINHTRANG", radioBnt_trong.Checked ? "0" : "1");
mình nghĩ là trình tự các bước là làm như thế và mình đã làm đc
hy vọng bài này có ích cho các bạn chưa biết sử dụng nhiều lệnh SQL

vuonghao77
07-11-2010, 04:43 PM
Mình cũng đang làm về phần này, mình chưa hiểu rỏ chỗ 2 câu lệnh trong vòng for, biết là nó dùng để lưu các giá trị vào mảng nhưng mình không hình dung được là nó thực hiện như thế nào?


for (int i = 0; i < pars.Length; i += 2)
{
SqlParameter par = new SqlParameter(pars[i].ToString(), pars[i + 1]);
lenhsql.Parameters.Add(par);
}

jscaothe
09-11-2010, 12:06 AM
Bạn có thể viết hàm như thế này cho dễ hiểu

public static void ExecuteNonQuery(
string sql,
CommandType commandType,
string[] pars,string[] values)
{
SqlConnection ketnoi = new SqlConnection(chuoikn);
ketnoi.Open();

SqlCommand cmd= new SqlCommand(sql, ketnoi);
cmd.CommandType = commandType;

for (int i = 0; i < pars.Length; i ++)
{
cmd.Parameters.addwithvalues(pars[i],values[i]);
}

cmd.ExecuteNonQuery();
ketnoi.Close();
}

Và khi goik thì

string[] pars={"@a","@b"};
string[] values={"gt1","gt2"}
ExecuteNonQuery("StoredProcedure1",CommandType.StoredProcedure,pars,values);