`
mlzboy
  • 浏览: 726797 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

Adodbapi调用sqlserver储存过程的问题及pymssql的使用2009-12-22

阅读更多

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的日志 - 网易博客

分享到:
评论

相关推荐

    pymssql-2.1.5-cp36-cp36m-win_amd64.zip

    9. **存储过程调用**:可以使用`execute()`方法调用SQL Server的存储过程,并通过占位符传递参数。 10. **关闭连接**:在完成数据库操作后,记得关闭连接以释放资源,可以使用`close()`方法。 总之,pymssql是...

    SQLServer存储过程调用WebService

    本文将详细介绍如何在 SQL Server 存储过程中调用 Web Service,并针对不同的 SQL Server 版本及操作系统环境提供相应的解决方案。 #### 二、环境配置与准备工作 ##### 2.1 安装 Soap Toolkit 3.0 组件 在 SQL ...

    java调用sqlserver存储过程.pdf

    "Java 调用 SQL Server 存储过程" Java 调用 SQL Server 存储过程是指在 Java 应用程序中调用 SQL Server 数据库中的存储过程,以实现数据的增删改查等操作。下面是关于 Java 调用 SQL Server 存储过程的知识点: ...

    pymssql-2.1.3-cp36-cp36m-win_amd64.whl

    除了基本的查询,pymssql还支持事务处理、参数化查询、存储过程调用等高级功能,可以满足各种复杂的数据库操作需求。 总结,`pymssql-2.1.3-cp36-cp36m-win_amd64.whl`是Python连接MySQL数据库的重要工具,对于需要...

    pymssql-2.2.4-cp310-cp310-win_amd64.zip

    《Python中的pymysql模块详解及安装指南》 在Python编程中,数据库操作是一个不可或缺的部分。pymysql作为Python连接MySQL数据库的一个库,为开发者提供了高效且便捷的接口。本文将详细阐述pymysql模块的核心功能,...

    执行Sqlserver存储过程返回DataSet

    ### 执行SQL Server 存储过程并返回DataSet 在软件开发过程中,经常需要与数据库进行交互,其中一种常见的场景就是通过调用存储过程来获取数据并处理这些数据。本篇文章将详细探讨如何在C#中执行SQL Server的存储...

    SQL Server调用Webservice示例

    调用Web Service在SQL Server中主要通过两种方式实现:T-SQL的XML方法和使用.NET Framework的存储过程。 1. **T-SQL的XML方法**: 使用T-SQL的内置函数如`OPENXML`、`sp_xml_preparedocument`和`sp_xml_...

    ADO.NET调用SQL Server存储过程

    ADO.NET调用SQL Server存储过程是数据库操作中的常见任务,特别是在.NET框架中。存储过程是一种预编译的SQL代码集合,它可以提高性能、减少网络流量并增强数据安全性。以下是关于如何使用ADO.NET调用存储过程的详细...

    C# winform调用SQL存储过程-菜鸟入门 详细注释

    内容概要:简单的C# winform调用存储过程实例,创建存储过程入参,通过SqlConnection对象和SqlCommand对象调用存储过程,获取存储过程的出参并显示出来,详细代码注释,希望对用到C#调用存储过程的小伙伴有帮助 ...

    实例讲解JSP调用SQL Server的存储过程

    这个例子讲解了如何使用JSP调用SQL Server的存储过程,并介绍了相关的知识点,例如创建表、创建存储过程、JSP调用存储过程、JDBC驱动、CallableStatement、Connection、事务机制和错误处理机制。

    SQL Server中存储过程比直接运行SQL语句慢的原因

    在SQL Server中,存储过程被认为是一种提升性能和代码组织的有效工具。然而,有时人们发现存储过程的执行速度比直接运行SQL语句要慢,这主要归因于几个因素。 首先,存储过程的编译和缓存机制。存储过程在创建时...

    Sql Server 存储过程的导出导入.doc

    在SQL Server中,存储过程是一种预编译的SQL语句集合,它允许开发人员封装一组复杂的操作,并在需要时重复调用。存储过程对于数据库管理、数据处理和性能优化具有重要意义。本文主要介绍如何在SQL Server中导出和...

    SQL server存储过程习题,SQL触发器习题.rar

    在SQL Server数据库管理系统中,存储过程和触发器是两种非常重要的数据库编程元素,它们对于数据库设计和数据管理具有深远的影响。下面将详细讲解这两个概念及其相关的知识点。 **SQL存储过程**: 1. **定义**:SQL...

    oracle到sqlserver存储过程语法转换

    ### Oracle到SQL Server存储过程语法转换详解 在数据库迁移项目中,从Oracle迁移到SQL Server是一种常见的场景。本文旨在提供一份详细的指南,帮助开发者更好地理解这两种数据库系统在存储过程方面的语法差异,并...

    SQLServer储存过程-130808

    ### SQL Server 存储过程详解 #### 引言与概念 存储过程,作为数据库管理系统中的重要组成部分,尤其在SQL Server中扮演着核心角色。它是一种预编译的SQL语句集合,存储在数据库中,可以接受输入参数,执行一系列...

    SQLSERVER存储过程例子

    在SQL Server中,我们可以使用`CREATE PROCEDURE`语句创建存储过程,然后通过`EXEC`命令执行。例如: ```sql CREATE PROCEDURE ProcName (@param1 INT) AS BEGIN SELECT * FROM TableName WHERE Column = @...

    BPEL调用SQLServer数据库存储过程Demo

    1. **创建存储过程**:在SQLServer中,使用T-SQL语句创建一个存储过程,包括输入参数(如果有的话)和执行的SQL语句。 2. **定义WSDL接口**:在WSDL文件中,定义一个操作(Operation),其消息部分(Message)描述...

    SQL_Server_存储过程_-_hoojo_-_博客园

    根据提供的文件信息,以下是对SQL Server存储过程的相关知识点的详细阐述: ### 存储过程的概念 存储过程(Procedure)是一种预先定义并经过编译的SQL语句集合,它存储于数据库之中,用户可以通过指定存储过程的...

    SQLServer存储过程在系统开发中的应用

    ### SQL Server 存储过程在系统开发中的应用 #### 概述 在现代数据库系统开发过程中,SQL Server 存储过程被广泛应用于提高系统性能、简化应用程序开发以及增强安全性等方面。存储过程是一种预编译的SQL脚本,它...

Global site tag (gtag.js) - Google Analytics