日期:2014-05-20  浏览次数:20874 次

◆◇◆ 如何使用 C# 编写扩展存储过程? ◆◇◆
sp_addextendedproc   跟   sp_OACreate   又是什么关系?

为什么有的用   sp_addextendedproc   有的又用   sp_OACreate?

我需要一个   C#   写的扩展存储过程的例子,使用   sp_addextendedproc   的。

请不要给我那个网上到处都能找到的使用   sp_OACreate   的例子。因为我试过。不成功。

------解决方案--------------------
你是指创建 SQL SERVER 2005 的存储过程吗?
如果是,那跟 sp_addextendedproc 没有任何关系


以下是我做的一个查询IP地址归属地的CLR存储过程,三步:

1、用C#来做DLL,代码如下:

//====================================================================
using System;
using System.Collections.Generic;
using System.Text;
using System.Data.SqlTypes;
using System.Data.SqlClient;
using Microsoft.SqlServer.Server;

public class AddrInfo
{
[Microsoft.SqlServer.Server.SqlProcedure]
public static void getAddrInfo(SqlString ip, out SqlString info)
{
using (SqlConnection connection = new SqlConnection( "context connection=true "))
{
//IP地址转为数字
string[] tmp = ip.Value.Split(new string[]{ ". "},StringSplitOptions.None);
Int64 ipn = ToInt(ToBinary(tmp[0]) + ToBinary(tmp[1]) + ToBinary(tmp[2]) + ToBinary(tmp[3]));

connection.Open();
SqlCommand cmd = new SqlCommand();
cmd.Connection = connection;
cmd.CommandType = System.Data.CommandType.Text;

cmd.CommandText = "select addr_info from CZIP where ipn1 <= "
+ ipn.ToString() + " and ipn2> = "
+ ipn.ToString();
SqlDataReader dr = cmd.ExecuteReader();

using (dr)
{
if (dr.Read())
{
info = dr.GetString(0);
}
else
{
info = " <无归属地数据> ";
}
}
}
}

/// <summary>
/// INT32 转为二进制字符串
/// </summary>
/// <param name= "piNumber "> </param>
/// <returns> </returns>
private static String ToBinary(string num)
{
int piNumber = Int32.Parse(num);
string strBinary = " ";
int iTmp;

do
{
iTmp = piNumber % 2;
strBinary = iTmp.ToString() + strBinary;
piNumber = piNumber / 2;
} while (piNumber != 0);

return strBinary.PadLeft(8, '0 ');
}

/// <summary>
/// 二进制字符串转为整数
/// </summary>
/// <param name= "pStrBinary "> </param>
/// <returns> </returns>
private static long ToInt(string pStrBinary)
{
char[] charArr = pStrBinary.ToCharArray();
long iReturnValue = 0;
int iPow = 0;

for (int i = 0; i < charArr.Length; i++)
{
if (charArr[i].ToString() != "0 " && charArr[i].ToString() != "1 ")
{ throw new Exception( "输入字符串格式不正确! "); }
}

for (int i = 0; i < charArr.Length; i++)
{
iPow = Convert.ToInt32(charArr[i].ToString());
iReturnValue += iPow * Convert.ToInt64(Math.Pow(2, charArr.Length - i - 1));
}

return iReturnValue;