◆◇◆ 如何使用 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;