好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

Adodbapi调用sqlserver储存过程的问题及pymssql的使用20091222

Adodbapi调用sqlserver储存过程的问题及pymssql的使用20091222

Python有好也有坏,库非富,但要真一个能适合自己用的还是得自己费些功夫,去验证,因为有些库可能已经年代久远了,或是跟不上时代了,

在我想利用py来调用储存过程时,google,baidu到两篇有比较有质量的文章

Adodbapi执行Ms Sqlserver存储过程的问题 - 徐明的博客

Python使用SQL SERVER存储过程 - python - Python - JavaEye论坛

我花了一个下午的时间,来测试adodbapi这个库到底能不能用来调用储存过程,在调用cur.fetchall()还是会报错

因此我还是转而使用pymssql库了,

这里对我没有去仔细看adodbapi库的代码的问题进行fix感到小小的羞愧,希望用此文告知后来人,少走弯路,我内心也会好过一些。

下面是我用pymssql写的调用储存过程的代码

 #!/usr/bin/env python
 

 # -*- coding:utf8 -*-
 

 #对pymssql库的储存过程调用进行测试
 

  import  pymssql
 

 server = '192.168.1.11'  
 

  user  = 'test'  
 

 password = 'test'  
 

 database = 'db'  
 

 sp = 'DM_R_GetUserProductIDsFromMinUserIDtoMaxUserIDWithConstrains'  
 

 

 sql=" DECLARE @return_value int;EXEC @return_value = [dbo].[DM_R_GetUserProductIDsFromMinUserIDtoMaxUserIDWithConstrains] %s,%s,%s,%s,%s;SELECT    'Return Value' = @return_value " % (0,5000,1,9,2)
 

  print  sql
 

 

  def  ffchk(server,  user , password, database, sql):  
 

     try:  
 

         db = pymssql.connect(host = server,  
 

                     database = database,  
 

 
				 user  =  user ,  
 

                     password = password,  
 

                     login_timeout = 10)  
 

         cur = db.cursor()  
 

         cur.execute(sql) 
 

         row = cur.fetchone()
 

 
				 print  type(row)
 

         while row:
 

 
				 print  " ProductIDs=%s " % (row[0])
 

             row = cur.fetchone()
 

 

     except Exception, e:  
 

 
				 print  e  
 

     finally:  
 

         try: db. close ()  
 

         except: pass  
 

 

 ffchk(server, user ,password,database,sql)
 

 

参考文章

pymssql - simple MS SQL Python extension module

Python学习笔记十(pymssql数据库操作) - 我的鱼塘 - JavaEye技术网站

    

PS:本文的高亮使用了 Highlight : code & syntax highlighting : by André Simon

    

另外再介绍两个高亮的网站:

codepaste

代码发芽网 - 代码高亮 无需插件 近百种语言 30多种高亮主题

Windows live writer也是一个不错的写blog的工具,他也有一个代码高亮的插件 Windows Live Gallery

    

另外我想说的是,百度的爬虫策略还是很牛的,这篇文章提交上去不到一分钟,在我搜索的时候显示出来了,而且位置在头条。虽然寡人不吊steven lee,但是还是小小表扬一下它吧。

   

关于pymssql的操作的更好的封装

 #!/usr/bin/env python
 

 # -*- coding:utf8 -*-
 

 #http: //lexus.cnblogs.com 
			 

 #frederick.mao@gmail.com
 

 #这个脚本的作用是,调用SQLServer的储存过程,导出MinUserId到MaxUserId的间的数据储存到一个文本文件中,以MinUserId-MaxUserId.txt做为储存文件名
 

 # write  @2009/12/22
 

 

  import 
				 sys ,pymssql,ericklib
 

 

  def  f(cur):
 

 
				 return  cur.fetchall()
 

 #    row=cur.fetchone()
 

 #    while row:
 

 #         print  " ProductIDs=%s " % (row[0])
 

 #        row = cur.fetchone()
 

 

 

 

  def  connectdb_invoke_callback_and_return_recordset(server,  user , password, database, sql,callback):  
 

     try:  
 

         db = pymssql.connect(host = server,  
 

                     database = database,  
 

 
				 user  =  user ,  
 

                     password = password,  
 

                     login_timeout = 10)  
 

         cur = db.cursor()  
 

         cur.execute(sql)
 

 
				 return  callback(cur)
 

     except Exception, e:
 

 
				 print  e  
 

     finally:  
 

         try: db. close ()  
 

         except: pass  
 

 

 

  def  export_user_brought_productIDs_between_minuserid_and_maxuserid(min,max):
 

     '''
 

     导出用户id在min和max之间的每个用户购买过的品类
 

     '''
 

     server = '192.168.1.1'  
 

 
				 user  = 'test'  
 

     password = 'test'  
 

     database = 'db'  
 

     sp = 'DM_R_GetUserProductIDsFromMinUserIDtoMaxUserIDWithConstrains'  
 

     sql=" DECLARE @return_value int;EXEC @return_value = %s %s,%s,%s,%s,%s;SELECT    'Return Value' = @return_value " % (sp,min,max,1,9,2)
 

 
				 print  sql
 

     result=connectdb_invoke_callback_and_return_recordset(server,  user , password, database, sql,f)
 

     prefix_path=ericklib.getcwd()+'\\ data \\'
 

     ericklib.createfolders(prefix_path)
 

 
				 if (result is None):
 

 
				 print  (u'用户%s-%s结果为none' % (min,max)). encode ('gbk'," ignore ")
 

         #创建ascii编码格式的空白文件
 

         ff= open (prefix_path+'%s-%s,0.txt'%(min,max),'w')
 

         ff. close ()
 

 
				 else :
 

         ff= open (prefix_path+'%s-%s,%s.txt'%(min,max,len(result)),'w')
 

         for e in result:
 

 
				 print  e
 

             ff. write (e[0]+'\n')
 

         ff. close ()
 

 

  def  main(argv=None):
 

      if  argv is None:
 

         argv =  sys .argv
 

         minuserid,maxuserid=argv[1],argv[2]
 

 
				 print  minuserid,maxuserid
 

         list=range(int(minuserid),int(maxuserid),2000)
 

         list.append(maxuserid)
 

 #        for i in xrange(0,len(list)):
 

 #             print  list[i]
 

 
				 def  fff(x,y):
 

             export_user_brought_productIDs_between_minuserid_and_maxuserid(x,y)
 

 
				 print  x,y
 

 
				 return  y
 

         reduce(fff,list)
 

 #        export_user_brought_productIDs_between_minuserid_and_maxuserid(minuserid,maxuserid)
 

 

 

 

 

 

  if  __name__==' __main__ ':
 

     #从外部接收两个参数一个分别代表MinUserId和MaxUserId
 

 
				 sys . exit (main())
 

 

 

我自己有一个小的设想是,我自己常用的一些小的py函数,做自己做一个模块,这样每次使用的是时候,就不用每次都去google或是百度了,下面几个是我在此次写脚本中遇到 的一些东东有用的文章

[Script]采用Python创建当前日期文件夹 - 今我来思 - 博客园

[Python]文件的创建与追加 - Python - 睡前要抱抱

用Python直接写UTF-8文本文件 - DBLobster的日志 - 网易博客

查看更多关于Adodbapi调用sqlserver储存过程的问题及pymssql的使用20091222的详细内容...

  阅读:63次

上一篇: mac使用笔记

下一篇:subsonic资源聚合