关于PostGreSQL中的存储过程

PostGreSQL中没有了像MSSql中的存储过程,但是有一个替代的都东西可以使用,就是函数,对于函数的使用方法,比如创建一个简单的查询一个表中的所有记录,我们这里根据这个公司所在地点来查询,这是一个Point类型,对于这种结合类型比较要'~='符号,下面类出表定义的SQL语句
Create table Google_Company(
    ID SERIAL,    --SERIAL 是PostGreSql中的数据类型,相当于Mssql中的自增类型
    Name  varchar(50),
   Geometry Point,
   Description  varchar(255),
   CONSTRAINT Google_CompanyKey PRIMARY KEY(ID)
)
插入两条数据
insert into google_company(companyname,geometry,abstract,url,image,subcategoryid) values('csu',point(28.5,113.0),'test','http://www.google.cn','d:',1);
insert into google_company(companyname,geometry,abstract,url,image,subcategoryid) values('csu',point(28.3,112.99),'test','http://www.google.cn','d:',1)
创建函数
  Create function ListCompany(Geometry) RETURNS SETOF Google_Company
$$ 
    select * from google_company where geometry~=$1            --这里$1表示传进来的第一个传输,$n表示第n个参数
$$ LANGUAGE SQL

这样一个postGreSQL中的函数就创建好了,下面我们在.net中使用它将其查询出来,这里我们引进一个新的dataprovider,在安装了postGreSQL中后就有一个Npgsql目录,里面有可以在.net中查询postGreSQL中数据的组件,在你的项目中引用它就可以了,而且其封装的很好,很遵循标准的ADO.NET模型
下面是根据上述建立表和函数来尽心在客户端查询的C#代码,放出来给大家参考参考,然后还有一个连接字符串,
 <add key="postGres" value="Server=127.0.0.1;Port=5432;User Id=postgres;Password=123;Database=MyGoogle;Encoding=UNICODE;"/>

using (NpgsqlConnection conn = new NpgsqlConnection(WebConfigurationManager.AppSettings["postGres"]))
        {
            NpgsqlCommand cmd = new NpgsqlCommand();
            cmd.CommandText = "ListCompany(:pt)";
            cmd.Parameters.Add(new NpgsqlParameter("pt", NpgsqlDbType.Point));
            cmd.Parameters[0].Value = new NpgsqlPoint(loc.X, loc.Y);
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Connection = conn;
            conn.Open();
            NpgsqlDataReader dr = cmd.ExecuteReader();
            while (dr.Read())
            {
                _member.CompanyID = Convert.ToInt32(dr["companyID"]);
                _member.Geometry = (NpgsqlPoint)dr["geometry"];
                _member.Image = dr["image"].ToString();
                _member.URL = dr["URL"].ToString();
                _member.CompanyName = dr["companyname"].ToString();
                _member.Abstract = dr["abstract"].ToString();
                _member.SubCategoryID = Convert.ToInt32(dr["subcategoryID"]);       
            }
            conn.Close();
            lblCompanyName.Text = _member.CompanyName;
            lblAbstract.Text = _member.Abstract;
        }
posted @ 2008-03-11 23:03  枫崖  阅读(1220)  评论(2编辑  收藏  举报