zoukankan      html  css  js  c++  java
  • 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的日志 - 网易博客

  • 相关阅读:
    barcode制作条形码及破解
    软件敏捷架构师
    软件需求分析三步走
    GDI+显示GIF动画
    CSpinButtonCtrl的弱智问题
    [C++] STL里面的map
    [C#] 再议Exception
    [C++] unsigned是麻烦制造者
    用GDI+转BMP为WMF、EXIF、EMF格式
    [C++] 编译时的warning
  • 原文地址:https://www.cnblogs.com/lexus/p/1629485.html
Copyright © 2011-2022 走看看