在ASP.NET 2.0中操作数据之七十三:用Managed Code创建存储过程和用户自定义函数(上部分)
Managed Code是指能够在托管代码环境中运行的代码,与之相对的是Unmanaged Code,需要依赖于操作系统底层的API和COM组件等,而且不受托管代码环境控制,容易引起内存泄漏等问题。本文将介绍如何使用Managed Code创建存储过程和用户自定义函数。
创建存储过程
存储过程是一组预编译SQL语句的集合,能够在不同的应用中进行共享,提高代码重用性和可维护性。在ASP.NET中,可以使用C#或VB.NET等语言编写存储过程。
步骤
-
创建SQL Server项目。
-
在项目中添加存储过程文件(文件扩展名为.sql),如以下例子中的MyStoredProcedure.sql:
CREATE PROCEDURE MyStoredProcedure (@Param1 INT, @Param2 VARCHAR(50))
AS
BEGIN
-- 执行SQL语句
SELECT * FROM MyTable WHERE Column1 = @Param1 AND Column2 = @Param2
END
- 在项目中添加Managed Code文件(文件扩展名为.cs或.vb),如以下例子中的MyConnection.cs:
```
using System.Data.SqlClient;
namespace MyNamespace
{
public class MyConnection
{
private SqlConnection conn;
public MyConnection(string connectionString)
{
this.conn = new SqlConnection(connectionString);
}
public SqlDataReader ExecuteStoredProcedure(string storedProcedureName, SqlParameter[] parameters)
{
SqlCommand cmd = new SqlCommand(storedProcedureName, conn);
cmd.CommandType = System.Data.CommandType.StoredProcedure;
cmd.Parameters.AddRange(parameters);
conn.Open();
SqlDataReader reader = cmd.ExecuteReader();
return reader;
}
}
}
```
- 在ASP.NET网站中使用Managed Code调用存储过程:
```
using System.Data.SqlClient;
using MyNamespace;
string connString = "Data Source=MyServer;Initial Catalog=MyDatabase;Integrated Security=True;";
MyConnection conn = new MyConnection(connString);
int param1 = 123;
string param2 = "ABC";
SqlParameter[] parameters = new SqlParameter[] {
new SqlParameter("@Param1", param1),
new SqlParameter("@Param2", param2)
};
SqlDataReader reader = conn.ExecuteStoredProcedure("MyStoredProcedure", parameters);
while (reader.Read())
{
// 处理查询结果
}
reader.Close();
conn.Close();
```
示例
在步骤3中的Managed Code文件中,可以添加一些检查参数、处理异常等逻辑代码,提高程序的健壮性和稳定性。例如:
public void InsertData(string tableName, Dictionary<string, object> data)
{
if (string.IsNullOrEmpty(tableName))
{
throw new ArgumentException("TableName cannot be empty.");
}
if (data == null || data.Count == 0)
{
throw new ArgumentException("Data cannot be null or empty.");
}
// 生成INSERT语句
StringBuilder sqlBuilder = new StringBuilder();
sqlBuilder.AppendFormat("INSERT INTO {0} ", tableName);
sqlBuilder.Append("(");
foreach (string key in data.Keys)
{
sqlBuilder.AppendFormat("{0}, ", key);
}
sqlBuilder.Length -= 2;
sqlBuilder.Append(")");
sqlBuilder.Append(" VALUES ");
sqlBuilder.Append("(");
foreach (object value in data.Values)
{
sqlBuilder.AppendFormat("'{0}', ", value);
}
sqlBuilder.Length -= 2;
sqlBuilder.Append(")");
// 执行SQL语句
SqlCommand cmd = new SqlCommand(sqlBuilder.ToString(), conn);
conn.Open();
cmd.ExecuteNonQuery();
conn.Close();
}
创建用户自定义函数
用户自定义函数是一段可重用的代码,能够在SQL语句中使用,例如进行字符串操作、日期计算等。在ASP.NET中,可以使用C#或VB.NET等语言编写用户自定义函数。
步骤
-
创建SQL Server项目。
-
在项目中添加用户自定义函数文件(文件扩展名为.cs或.vb),如以下例子中的MyFunction.cs:
```
using System.Data.SqlTypes;
public class MyFunction
{
[Microsoft.SqlServer.Server.SqlFunction(IsDeterministic = true)]
public static SqlString MyStringFunction(SqlString input)
{
if (input.IsNull)
return SqlString.Null;
else
return new SqlString(input.Value.ToUpper());
}
[Microsoft.SqlServer.Server.SqlFunction(IsDeterministic = true)]
public static SqlInt32 MyIntFunction(SqlInt32 input)
{
if (input.IsNull)
return SqlInt32.Null;
else
return input.Value + 1;
}
}
```
-
使用SQL Server项目的“生成”命令生成DLL文件(文件扩展名为.dll)。
-
在SQL Server中创建用户自定义函数,如以下例子中的MyStringFunction:
CREATE FUNCTION MyStringFunction(@input NVARCHAR(MAX))
RETURNS NVARCHAR(MAX)
AS EXTERNAL NAME [MyAssembly].[MyNamespace.MyFunction].MyStringFunction
- 在ASP.NET网站中使用用户自定义函数:
SELECT MyStringFunction('abc') -- 返回ABC
SELECT MyIntFunction(123) -- 返回124
示例
可以在用户自定义函数中添加一些自定义的逻辑代码,例如:
public class MyFunction
{
[Microsoft.SqlServer.Server.SqlFunction(IsDeterministic=true)]
public static SqlInt32 MyCountFunction(string input, char separator)
{
if (string.IsNullOrEmpty(input))
return SqlInt32.Null;
else
return new SqlInt32(input.Split(separator).Length);
}
}
总结
本文介绍了如何使用Managed Code创建存储过程和用户自定义函数,提高代码重用性和可维护性。在实际开发中,可以根据业务需求进行适当的封装和优化,实现代码的高效复用。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:在ASP.NET 2.0中操作数据之七十三:用Managed Code创建存储过程和用户自定义函数(上部分) - Python技术站