用命令对象调用存储过程,就是定义存储过程的名字,给过程的每一个参数添加参数定义,然后再用SqlCommand命令执行。
下面实例主要以数据库Region表中插入更新的存储过程。
首先给项目添加一个资源文件命名为Strings,在添加存储过程语句:
<data name="CreateSprocs" xml:space="preserve">
<value>IF OBJECT_ID('RegionInsert') IS NULL
EXEC ('
--
-- Procedure which inserts a region record and returns the key
--
CREATE PROCEDURE RegionInsert(@RegionDescription NCHAR(50),
@RegionID INTEGER OUTPUT)AS
SET NOCOUNT OFF;
SELECT @RegionID = MAX ( RegionID ) + 1
FROM Region ;
INSERT INTO Region(RegionID, RegionDescription)
VALUES(@RegionID, @RegionDescription);')
IF OBJECT_ID('RegionUpdate') IS NULL
EXEC ('
--
-- Procedure to update the description of a region
--
CREATE PROCEDURE RegionUpdate(@RegionID INTEGER,
@RegionDescription NCHAR(50))AS
SET NOCOUNT OFF;
UPDATE Region
SET RegionDescription = @RegionDescription
WHERE RegionID = @RegionID;');</value>
</data>
在App.config文件里面配置数据库连接语句:
<connectionStrings>
<clear/>
<add name="MyDBPractice" connectionString="server=(local);integrated security=SSPI;database=MyDBPractice;" providerName="System.Data.SqlClient"/>
</connectionStrings>
添加类DBConnection用于创建工厂:
public class DBConnection
{
public static DbConnection GetDBConnection(string name)
{
ConnectionStringSettings settings = ConfigurationManager.ConnectionStrings[name];
DbProviderFactory factory = DbProviderFactories.GetFactory(settings.ProviderName);
DbConnection conn = factory.CreateConnection();
conn.ConnectionString = settings.ConnectionString;
return conn;
}
}
在Program.cs类中添加如下代码:
class Program
{
static void Main(string[] args)
{
try
{
using (SqlConnection conn = (SqlConnection)DBConnection.GetDBConnection("MyDBPractice"))
{
conn.Open();
InitDBData(conn);//ensure the procedure exist
SqlCommand updateCommand = GenerateUpdateCommand(conn);
SqlCommand insertCommand = GenerateInsertCommand(conn);
DumpRegion(conn, "check the result begin:");
insertCommand.Parameters["@RegionDescription"].Value = "South West";
insertCommand.ExecuteNonQuery();
int newRegionID = (int)insertCommand.Parameters["@RegionID"].Value;
updateCommand.Parameters["@RegionDescription"].Value = "England";
updateCommand.Parameters["@RegionID"].Value = newRegionID;
updateCommand.ExecuteNonQuery();
}
}
catch (SqlException se)
{
Console.WriteLine(se.Errors);
}
}
/// <summary>
/// check the procedure
/// </summary>
/// <param name="conn"></param>
private static void InitDBData(SqlConnection conn)
{
SqlCommand cmd = new SqlCommand(Strings.CreateSprocess, conn);
cmd.ExecuteNonQuery();
}
/// <summary>
/// create a command that will update a region record
/// </summary>
/// <param name="conn">database connection</param>
/// <returns>a command</returns>
private static SqlCommand GenerateUpdateCommand(SqlConnection conn)
{
SqlCommand sCommand = new SqlCommand("RegionUpdate", conn);
sCommand.CommandType = CommandType.StoredProcedure;
sCommand.Parameters.Add(new SqlParameter("@RegionID",SqlDbType.Int,0,"RegionID"));
sCommand.Parameters.Add(new SqlParameter("@RegionDescription", SqlDbType.NChar, 50, "RegionDescription"));
sCommand.UpdatedRowSource = UpdateRowSource.None;//do not apply the result to dataset
return sCommand;
}
private static SqlCommand GenerateInsertCommand(SqlConnection conn)
{
SqlCommand sCommand = new SqlCommand("RegionInsert", conn);
sCommand.CommandType = CommandType.StoredProcedure;
sCommand.Parameters.Add(new SqlParameter("@RegionID", SqlDbType.Int, 0, ParameterDirection.Output, false, 0, 0,
"RegionID",DataRowVersion.Default,null));
sCommand.Parameters.Add(new SqlParameter("@RegionDescription", SqlDbType.NChar, 50, "RegionDescription"));
return sCommand;
}
private static void DumpRegion(SqlConnection conn, string message)
{
SqlCommand sCommand = new SqlCommand("select t.* from Region", conn);
SqlDataReader sqlReader = sCommand.ExecuteReader();
Console.WriteLine(message);
do
{
sqlReader.Read();
Console.WriteLine("{0, -20},{1,-40}", sqlReader[0], sqlReader[1]);
} while (sqlReader.Read());
}
}