C#運用儲存過程新增一條記錄並返回自動生成的ID
前言:
1、儲存過的好處:
儲存過程相對於其他的資料庫訪問方法有以下的優點:
(1)重複使用。儲存過程可以重複使用,從而可以減少資料庫開發人員的工作量。
(2)提高效能。儲存過程在建立的時候就進行了編譯,將來使用的時候不用再重新編譯。一般的SQL語句每執行一次就需要編譯一次,所以使用儲存過程提高了效率。
(3)減少網路流量。儲存過程位於伺服器上,呼叫的時候只需要傳遞儲存過程的名稱以及引數就可以了,因此降低了網路傳輸的資料量。
(4)安全性。引數化的儲存過程可以防止SQL注入式的攻擊。
2、儲存過程知識拓展:
(1)儲存過程共分為3類:
A.返回記錄集的儲存過程。其執行結果是一個記錄集,例如:從資料庫中檢索出符合某一個或幾個條件的記錄
B.返回數值的儲存過程(也可以稱為標量儲存過程)。其執行完以後返回一個值,例如:在資料庫中執行一個有返回值的函式或命令
C.行為儲存過程。用來實現資料庫的某個功能,而沒有返回值,例如:在資料庫中的更新和刪除操作
(2)含有return的儲存過程其返回值為return返回的那個值。
(3)沒有return的儲存過程,不論執行結果有無記錄集,其返回值是0。
(4)帶輸出引數的儲存過程:假如有return則返回return返回的那個值,假如要select輸出引數,則出現輸出引數的值,於有無return無關。
3、需求:
有的時候,我們可能需要得到由儲存過程自動生成的ID,那麼下面我將詳細介紹。
一、資料設計
1.資料表設計如下表(表名為users):
欄位名 |
欄位型別 |
是否為null |
欄位預設值 |
備註 |
nc_uid |
nchar(20) |
× |
使用者ID(Primary Key) |
|
nvc_username |
nvarchar(50) |
× |
使用者名稱 |
|
nvc_password |
nvarchar(50) |
× |
密碼 |
2.儲存過程如下:
二、後臺
1.model類
using System; namespace Model { /// <summary> /// shuju:實體類(屬性說明自動提取資料庫欄位的描述資訊) /// </summary> [Serializable] public partial class usersModel { public usersModel() { } #region Model private string _nc_uid; private string _nvc_username; private string _nvc_password; /// <summary> /// 使用者id(Primary Key) /// </summary> public string nc_uid { set { _nc_uid = value; } get { return _nc_uid } } /// <summary> /// 使用者名稱 /// </summary> public string nvc_username { set { _nvc_username =value; } get { return_nvc_username; } } /// <summary> /// 密碼 /// </summary> public string nvc_password { set { _nvc_password =value; } get { return_nvc_password; } } #endregion Model } }
2.DAL類
using System;
using System.Data;
using System.Text;
using System.Data.SqlClient;
using DBUtility;
using Model;
namespace DAL
{
/// <summary>
/// 資料訪問類:users
/// </summary>
public partial class usersDAL
{
public usersDAL()
{}
/// <summary>
/// 新增一條記錄 執行儲存過程
/// </summary>
/// <paramname="model">Model</param>
///<returns>id</returns>
public stringAddByProcedure(usersModel model)
{
string uid = null;
IDataParameter[]parameters = {
newSqlParameter("@nc_uid", SqlDbType.NChar,20),
newSqlParameter("@nvc_username", SqlDbType.NVarChar,50),
newSqlParameter("@nvc_password", SqlDbType.NVarChar,50)};
parameters[0].Direction= ParameterDirection.Output;//注意這裡
parameters[1].Value =model.nvc_username;
parameters[2].Value =model.nvc_password;
uid =DbHelperSQL.RunProcedure("sp_users_Add ", "@nc_uid",parameters).ToString();
return uid;
}
}
}
3.DbHelperSQL類
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
using System.Data;
using System.Collections;
namespace DBUtility
{
/// <summary>
/// 資料訪問抽象基礎類
/// </summary>
public abstract class DbHelperSQL
{
//資料庫連線字串(web.config來配置),多資料庫可使用DbHelperSQLP來實現.
public static stringconnectionString = PubConstant.ConnectionString;
public DbHelperSQL(){}
/// <summary>
///執行儲存過程,返回Output輸出引數值
/// </summary>
/// <paramname="storedProcName">儲存過程名</param>
/// <paramname="output">要返回值的引數名</param>
/// <paramname="parameters">儲存過程引數</param>
///<returns>string</returns>
public static object RunProcedure(stringstoredProcName, string output, IDataParameter[] paramenters)
{
using (SqlConnectionconnection = new SqlConnection(connectionString))
{
connection.Open();
SqlCommand command = BuildQueryCommand(connection,storedProcName, paramenters);
//記錄條數
command.ExecuteNonQuery();
//output和具體的儲存程引數對應
object obj =command.Parameters[output].Value.ToString(); if ((Object.Equals(obj, null))|| (Object.Equals(obj, System.DBNull.Value)))
{
return null;
}
else
{
return obj;
}
}
}
/// <summary>
/// 構建 SqlCommand 物件(用來返回一個結果集,而不是一個整數值)
/// </summary>
/// <paramname="connection">資料庫連線</param>
/// <paramname="storedProcName">儲存過程名</param>
/// <paramname="parameters">儲存過程引數</param>
///<returns>SqlCommand</returns>
private static SqlCommandBuildQueryCommand(SqlConnection connection, string storedProcName,IDataParameter[] parameters)
{
SqlCommand command = newSqlCommand(storedProcName, connection);
command.CommandType =CommandType.StoredProcedure;
foreach (SqlParameterparameter in parameters)
{
if (parameter !=null)
{
// 檢查未分配值的輸出引數,將其分配以DBNull.Value.
if((parameter.Direction == ParameterDirection.InputOutput || parameter.Direction== ParameterDirection.Input) &&
(parameter.Value == null))
{
parameter.Value = DBNull.Value;
}
command.Parameters.Add(parameter);
}
}
return command;
}
}
}