对于jdbc和python下调用sqlserver的存储过程感兴趣的读者,本文将提供您所需要的所有信息,我们将详细讲解python用jdbc连接数据库,并且为您提供关于.net下调用sqlserver
对于jdbc和python下调用sqlserver的存储过程感兴趣的读者,本文将提供您所需要的所有信息,我们将详细讲解python用jdbc连接数据库,并且为您提供关于.net下调用sqlserver存储过程的小例子、ASP 调用sqlserver存储过程学习教程、C#调用ODBC连接SQL Server数据库的存储过程、C#调用SQL Server中有参数的存储过程的宝贵知识。
本文目录一览:- jdbc和python下调用sqlserver的存储过程(python用jdbc连接数据库)
- .net下调用sqlserver存储过程的小例子
- ASP 调用sqlserver存储过程学习教程
- C#调用ODBC连接SQL Server数据库的存储过程
- C#调用SQL Server中有参数的存储过程
jdbc和python下调用sqlserver的存储过程(python用jdbc连接数据库)
一、环境(docker mssql-server-linux)
具体不再描述:参见本人博文unbuntu下Docker安装oracle和mysql,sqlserver中的第七部分。
二、创建mydb库,并把owner改为mymotif:
docker exec -it mssql /opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P "wxwpxh01!"
1> CREATE DATABASE mydb COLLATE Chinese_PRC_CI_AS;
2>go
1> use mydb
2> go
1>EXEC sp_changedbowner ''mymotif'';
2> go
-- 或直接赋予mymotif具有sysadmin权限(再mymotif登录后建立数据库mydb)
1> EXEC master.dbo.sp_addsrvrolemember @loginame = N''mymotif'', @rolename = N''sysadmin''
2> go
1>exit
mymotif登陆后建立表:
docker exec -it mssql /opt/mssql-tools/bin/sqlcmd -S localhost -U mymotif -P "wxwpxh01!" -d mydb
1>use mydb (不是必须,sqlcmd已有-d参数)
2>go
1> CREATE TABLE CUSTOMERS(ID INT NOT NULL, NAME VARCHAR (20) NOT NULL, AGE INT NOT NULL, ADDRESS CHAR (25) , SALARY DECIMAL (18, 2), PRIMARY KEY (ID))
2> go
INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY) VALUES (1, ''Ramesh'', 32, ''Ahmedabad'', 2000.00 );
INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY) VALUES (2, ''Khilan'', 25, ''Delhi'', 1500.00 );
INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY) VALUES (3, ''kaushik'', 23, ''Kota'', 2000.00 );
INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY) VALUES (4, ''Chaitali'', 25, ''Mumbai'', 6500.00 );
INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY) VALUES (5, ''Hardik'', 27, ''Bhopal'', 8500.00 );
INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY) VALUES (7, ''Muffy'', 24, ''Indore'', 10000.00 );
go
建立存储过程并测试:
1> CREATE PROCEDURE SelectAllCustomers AS SELECT * FROM Customers
2> go
1> exec SelectAllCustomers
2> go
ID NAME AGE ADDRESS SALARY
1 Ramesh 32 Ahmedabad 2000.00
2 Khilan 25 Delhi 1500.00
3 kaushik 23 Kota 2000.00
4 Chaitali 25 Mumbai 6500.00
5 Hardik 27 Bhopal 8500.00
6 Komal 22 MP 4500.00
7 Muffy 24 Indore 10000.00
(7 rows affected)
(return status = 0)
三、不带参数的代码:
package www.zjptcc.wxw.jdbc;
/*
*
use mydb
1> CREATE TABLE CUSTOMERS(ID INT NOT NULL, NAME VARCHAR (20) NOT NULL, AGE INT NOT NULL, ADDRESS CHAR (25) , SALARY DECIMAL (18, 2), PRIMARY KEY (ID))
2> go
INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY) VALUES (1, ''Ramesh'', 32, ''Ahmedabad'', 2000.00 );
INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY) VALUES (2, ''Khilan'', 25, ''Delhi'', 1500.00 );
INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY) VALUES (3, ''kaushik'', 23, ''Kota'', 2000.00 );
INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY) VALUES (4, ''Chaitali'', 25, ''Mumbai'', 6500.00 );
INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY) VALUES (5, ''Hardik'', 27, ''Bhopal'', 8500.00 );
INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY) VALUES (7, ''Muffy'', 24, ''Indore'', 10000.00 );
go
1> CREATE PROCEDURE SelectAllCustomers AS SELECT * FROM Customers
2> go
*
* */
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
public class TestMsSp1 {
/**
* @param args
*/
static String url = "jdbc:sqlserver://127.0.0.1:1433;DatabaseName=mydb";
public static void main(String[] args) {
// TODO 自动生成的方法存根
Connection conn = null;
try {
Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
conn = DriverManager.getConnection(url, "mymotif", "wxwpxh01!");
CallableStatement cs=conn.prepareCall("{call SelectAllCustomers()}");
ResultSet rs=cs.executeQuery();
while (rs.next()) {
String name=rs.getString("NAME");
String address=rs.getString("ADDRESS");
String UserId=rs.getString("ID");
System.out.println(name+"\t"+address+"\t"+UserId);
}
System.out.println("查询成功");
System.out.println("-----------------------");
conn.close();
} catch (SQLException sqe) {
System.out.println("Unexpected exception : " + sqe.toString()
+ ", sqlstate = " + sqe.getSQLState());
System.exit(1);
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
}
四、运行
五、带参数的存储过程(利用AdventureWorks 示例数据库)
安装示例数据库:微软官网上去下载AdventureWorks2017.bak
docker cp AdventureWorks2017.bak eb86a8500f0c:/var/opt/mssql/data/.
~$ tsql -Sdockermssql -U sa -Pwxwpxh01!
locale is "zh_CN.UTF-8"
locale charset is "UTF-8"
using default charset "utf8"
1> RESTORE FILELISTONLY FROM DISK= ''./AdventureWorks2017.bak''
2> go
LogicalName PhysicalName Type FileGroupName Size MaxSize FileId CreateLSN DropLSN UniqueId ReadOnlyLSN ReadWriteLSN BackupSizeInBytes SourceBlockSize FileGroupId LogGroupGUID DifferentialBaseLSN DifferentialBaseGUID IsReadOnly IsPresent TDEThumbprint SnapshotUrl
AdventureWorks2017 C:\Program Files\Microsoft SQL Server\MSSQL14.MSSQL2017RTM\MSSQL\DATA\AdventureWorks2017.mdf D PRIMARY 276824064 35184372080640 1 0 0 733940A8-D019-4DC5-80F8-13E869A504EC 0 0 215285760 512 1 NULL 000000000-0000-0000-0000-000000000000 0 1 NULL NULL
AdventureWorks2017_log C:\Program Files\Microsoft SQL Server\MSSQL14.MSSQL2017RTM\MSSQL\DATA\AdventureWorks2017_log.ldf L NULL 75497472 2199023255552 2 0 0 B166C891-E43F-42DA-87FC-8D7F34022B35 0 0 0 512 0 NULL 0 00000000-0000-0000-0000-000000000000 0 1 NULL NULL
(2 rows affected)
1> RESTORE DATABASE AdventureWorks FROM DISK=''./AdventureWorks2017.bak'' WITH MOVE ''AdventureWorks2017'' TO ''/var/opt/mssql/data/AdventureWorks2017.mdf'', MOVE ''AdventureWorks2017_log'' TO ''/var/opt/mssql/data/AdventureWorks2017_log.ldf
j代码:
package www.zjptcc.wxw.jdbc;
import java.sql.*;
public class MssqlAdventureWorksp1 {
public static void main(String[] args) {
// Create a variable for the connection string.
// String connectionUrl =
// "jdbc:sqlserver://<server>:<port>;databaseName=AdventureWorks;user=<user>;password=<password>";
String connectionUrl = "jdbc:sqlserver://127.0.0.1:1433;DatabaseName=AdventureWorks;user=mymotif;password=wxwpxh01!";
try {
Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
Connection con = DriverManager.getConnection(connectionUrl);
CallableStatement stmt = con.prepareCall("{call uspGetEmployeeManagers(?)}");
stmt.registerOutParameter(1, Types.INTEGER);
stmt.setInt(1, 50); //设置参数
stmt.execute();
ResultSet rs = stmt.getResultSet();
// Iterate through the data in the result set and display it.
while (rs.next()) {
System.out.println(rs.getString("RecursionLevel") + " " + rs.getString("FirstName")+ " " + rs.getString("LastName"));
}
// 完成后关闭
rs.close();
stmt.close();
con.close();
} catch (ClassNotFoundException e1) {
// TODO 自动生成的 catch 块
e1.printStackTrace();
} // Handle any errors that may have occurred.
catch (SQLException e) {
e.printStackTrace();
}
}
}
运行截图:
官网上jdbc的例子(jdbc解压后在sqljdbc_8.2\chs/samples/connections/ConnectDataSource.java):
package www.zjptcc.wxw.jdbc.mssql;
/*=====================================================================
File: ConnectDataSource.java
Summary: This Microsoft JDBC Driver for SQL Server sample application
demonstrates how to connect to a SQL Server database by
using a data source object.
---------------------------------------------------------------------
This file is part of the Microsoft JDBC Driver for SQL Server Code Samples.
Copyright (C) Microsoft Corporation. All rights reserved.
This source code is intended only as a supplement to Microsoft
Development Tools and/or on-line documentation. See these other
materials for detailed information regarding Microsoft code samples.
THIS CODE AND INFORMATION ARE PROVIDED "AS IS" WITHOUT WARRANTY OF
ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
PARTICULAR PURPOSE.
=====================================================================*/
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import com.microsoft.sqlserver.jdbc.SQLServerDataSource;
public class ConnectDataSource {
public static void main(String[] args) {
// Create datasource.
SQLServerDataSource ds = new SQLServerDataSource();
/*
ds.setUser("<user>");
ds.setPassword("<password>");
ds.setServerName("<server>");
ds.setPortNumber(Integer.parseInt("<port>"));
*/
ds.setUser("mymotif");
ds.setPassword("wxwpxh01!");
ds.setServerName("127.0.0.1");
ds.setPortNumber(Integer.parseInt("1433"));
ds.setDatabaseName("AdventureWorks");
try (Connection con = ds.getConnection();
CallableStatement cstmt = con.prepareCall("{call dbo.uspGetEmployeeManagers(?)}");) {
// Execute a stored procedure that returns some data.
cstmt.setInt(1, 50);
ResultSet rs = cstmt.executeQuery();
// Iterate through the data in the result set and display it.
while (rs.next()) {
System.out.println("EMPLOYEE: " + rs.getString("LastName") + ", " + rs.getString("FirstName"));
System.out.println("MANAGER: " + rs.getString("ManagerLastName") + ", " + rs.getString("ManagerFirstName"));
System.out.println();
}
}
// Handle any errors that may have occurred.
catch (SQLException e) {
e.printStackTrace();
}
}
}
六、python下调用:
代码
#coding=utf-8
import pymssql
conn = pymssql.connect(host=''127.0.0.1'',user=''mymotif'',password=''wxwpxh01!'',database=''mydb'',charset="utf8")
cur = conn.cursor()
cur.execute("exec SelectAllCustomers") #cursor.execute("exec 存储过程名称 @参数1=''xxx'',@参数2=''xxx''")
info = cur.fetchall()
print (len(info)) #获得表中有多少条数据
for ii in info:
print (str(ii[0])+'' ''+ii[1]+'' ''+str(ii[2])+'' ''+ii[3]+'' ''+str(ii[4]))
cur.close()
conn.commit()
conn.close()
运行截图:
七、go语言访问SqlServer
安装驱动(可能要翻墙,我把denisenkom打包到网盘上,直接解压到$GOPATH/src/github.com就应该可以用了)
$ cd $GOPATH
$go get github.com/denisenkom/go-mssqldb
代码:
// mssqlt1.go
// go get github.com/denisenkom/go-mssqldb
package main
import (
"database/sql"
"fmt"
"log"
"time"
_ "github.com/denisenkom/go-mssqldb"
)
func main() {
var isdebug = true
var server = "127.0.0.1"
var port = 1433
var user = "sa"
var password = "wxwpxh01!"
var database = "AdventureWorks"
//连接字符串
connString := fmt.Sprintf("server=%s;port%d;database=%s;user id=%s;password=%s", server, port, database, user, password)
if isdebug {
fmt.Println(connString)
}
//建立连接
conn, err := sql.Open("mssql", connString)
if err != nil {
log.Fatal("Open Connection failed:", err.Error())
}
defer conn.Close()
//产生查询语句的Statement
stmt, err := conn.Prepare(`SELECT * FROM Person.ContactType`)
if err != nil {
log.Fatal("Prepare failed:", err.Error())
}
defer stmt.Close()
//通过Statement执行查询
rows, err := stmt.Query()
if err != nil {
log.Fatal("Query failed:", err.Error())
}
//建立一个列数组
cols, err := rows.Columns()
var colsdata = make([]interface{}, len(cols))
for i := 0; i < len(cols); i++ {
colsdata[i] = new(interface{})
fmt.Print(cols[i])
fmt.Print("\t")
}
fmt.Println()
//遍历每一行
for rows.Next() {
rows.Scan(colsdata...) //将查到的数据写入到这行中
PrintRow(colsdata) //打印此行
}
defer rows.Close()
}
//打印一行记录,传入一个行的所有列信息
func PrintRow(colsdata []interface{}) {
for _, val := range colsdata {
switch v := (*(val.(*interface{}))).(type) {
case nil:
fmt.Print("NULL")
case bool:
if v {
fmt.Print("True")
} else {
fmt.Print("False")
}
case []byte:
fmt.Print(string(v))
case time.Time:
fmt.Print(v.Format("2016-01-02 15:05:05.999"))
default:
fmt.Print(v)
}
fmt.Print("\t")
}
fmt.Println()
}
运行:
$ go run mssqlt1.go
server=127.0.0.1;port1433;database=AdventureWorks;user id=sa;password=wxwpxh01!
ContactTypeID Name ModifiedDate
1 Accounting Manager 30046-04-30 00:00:00
2 Assistant Sales Agent 30046-04-30 00:00:00
3 Assistant Sales Representative 30046-04-30 00:00:00
4 Coordinator Foreign Markets 30046-04-30 00:00:00
5 Export Administrator 30046-04-30 00:00:00
6 International Marketing Manager 30046-04-30 00:00:00
7 Marketing Assistant 30046-04-30 00:00:00
8 Marketing Manager 30046-04-30 00:00:00
9 Marketing Representative 30046-04-30 00:00:00
10 Order Administrator 30046-04-30 00:00:00
11 Owner 30046-04-30 00:00:00
12 Owner/Marketing Assistant 30046-04-30 00:00:00
13 Product Manager 30046-04-30 00:00:00
14 Purchasing Agent 30046-04-30 00:00:00
15 Purchasing Manager 30046-04-30 00:00:00
16 Regional Account Representative 30046-04-30 00:00:00
17 Sales Agent 30046-04-30 00:00:00
18 Sales Associate 30046-04-30 00:00:00
19 Sales Manager 30046-04-30 00:00:00
20 Sales Representative 30046-04-30 00:00:00
参考:
微软JDBC 驱动程序 API 参考
.net下调用sqlserver存储过程的小例子
首先,在sqlserver中创建存储过程,在调用时分为有参数和没有参数两种情况,先就简单的没有参数的情况简要的介绍:假设存储过程如下:
create proc selectall
as
select * from studentinf
则此sp的调用如下:
sqlcommand selectcmd = new sqlcommand(“selectall”,conn);
//conn 为sqlconnection
selectcmd.commandtype = commandtype.storedprocedure;
如果需要将结果集加到某个dataadapter上,则可如下:
sqldataadapter studa = new sqldataadapter();
studa.selectcommand = selectcmd;
如果有参数:create proc andselect
@studentid varchar(10),
@studentname varchar(10),
as
select * from studentinf where studentid = @studentid and studentname = @studentname
则参数可以如下添加:
selectcmd.parameters.add(“@studentid”,sqldbtype.nvarchar,10);
selectcmd.parameters.add(“@studentname”,10);
如果只有一个参数,也可以这样赋值:
sqlparameters onepara = selectcmd.parameters.add(“@studentid”,10);
onepara.value = “ a string ”
ASP 调用sqlserver存储过程学习教程
一、我先来来说一说调用存储过程的优点与缺点: 1、SQL语句已经预编绎过了,因此执行效率、性能大大增加。 2、可以接受参数、输出参数、返回单个或多个结果集以及返回。可以向程序返回错误原因。 3、减少网络流量。如:执行插入记录这个功能时只要传输存储过
一、我先来来说一说调用存储过程的优点与缺点:
1、SQL语句已经预编绎过了,因此执行效率、性能大大增加。
2、可以接受参数、输出参数、返回单个或多个结果集以及返回值。可以向程序返回错误原因。
3、减少网络流量。如:执行插入记录这个功能时只要传输存储过程名、参数和这些参数的数值即可。免去写一大串操纵的SQL语句。
我们将会发现要是网络速度慢时这个是多么的有用,即减少对客户机的压力,又可以简化一系列复杂语句。
4、减少注入式攻击。存储过程可以包含程序流、逻辑以及对数据库的查询。同时可以实体封装和隐藏了数据逻辑。
5、存储过程可以在单个存储过程中执行一系列SQL语句,存储过程内还可以嵌套其它存储过程。
6、有利于SQL语句的重用。
7、更强的适应性:由于存储过程对数据库的访问是通过存储过程来进行的,因此数据库开发人员可以在不改动存储过程接口的情况下对数据库进行任何改动,
而这些改动不会对应用程序造成影响。
8、 布式工作:应用程序和数据库的编码工作可以分别独立进行,而不会相互压制。
当一个业务同时对多个表进行处理的时候采用存储过程比较合适。
- 使用存储过程在一般情况下会提高性能,因为数据库优化了存储过程的数据访问计划并应用缓存方便以后的查询;
- 存储过程单独保护存在于数据库中。客户端可以获取权限执行存储过程,而不需要对底层的具体表设置其他的访问权限;
- 存储过程会使得维护起来更加方便,因为通常修改一个存储过程要比在一个已经发布的组件中修改SQL语句更加方便;
- 存储过程给底层数据格式增添了额外的抽象层。使得使用存储过程的客户端对存储过程的实现细节以及对底层数据格式是隔离独立的;
- 存储过程能够缓解网络带宽,因为可以批量执行SQL语句而不是从客户端发送超负载的请求。
复杂的数据处理用存储过程,如有些报表处理。
多条件多表联合查询,并做分页处理,用存储过程也比较适合。
适当的使用存储过程,能够提高我们SQL查询的性能,以便于提高我们的工作效率。本文就介绍这么多了,希望本次的介绍能够对您有所收获!
存储过程的缺点:
1.可移植性差,我一直采用sql server开发,可是如果想卖自己的东西,发现自己简直就是在帮ms卖东西,呵呵。想换成mysql,确实移植麻烦。
2.采用存储过程调用类,需要进行两次调用操作,一次是从sql server中取到过程的参数信息,并且建立参数;第二次才是调用这个过程。多了一次消耗。
不过这个缺点可以在项目开发完成,过程参数完全确定之后,把所有过程参数信息倒入到一个xml文件中来提高性能。
二、下面讲解一下存储过程的调用与创建:
第一步:创建存储过程
---创建存储过程模版
create PROCEDURE [存储过程名称]
@param nvarchar(4)---存储过程参数
AS
set nocount on
declare @SQL nvarchar(1000)
set @SQL='' 存储过程要执行的sql语句 ''
Exec sp_executesql @SQL -----执行sql语句
我先创建一个现象一个表所有内容的存储过程:
-------创建
CREATE PROCEDURE [KS_ShowContent]
@TableName nvarchar(50)
AS
set nocount on
declare @sql nvarchar(1000)
set @sql=''Select * From ''+@TableName
Exec sp_executesql @SQL
第二步:调用储调用存储过程
调用存储过程的方式有两种:
第一种调用方式:
Set rs=Conn.Execute("存储过程名称 参数")
比如调用[KS_ShowContent]存储过程:
Set rs=Conn.Execute("KS_ShowContent UserTabl")---UserTabl 是一个表名称
do while not rs.eof
id=rs("id")
rs.movenext
loop
rs.close : set rs=nothing
第二种调用方式:
Dim Cmd : Set Cmd = Server.CreateObject("ADODB.Command")
Set Cmd.ActiveConnection=conn
Cmd.CommandText="KS_TSql"''存储过程名称
Cmd.CommandType=4
CMD.Prepared = true
Cmd.Parameters.Append cmd.CreateParameter("@SQL",200,1,8000,SQLStr)''设置参数和设置参数的值
Set Rs=Cmd.Execute
set Cmd = nothing
do while not rs.eof
id=rs("id")
rs.movenext
loop
rs.close : set rs=nothing
----------注释
CreateParameter (Name, Type, Direction, Size, Value)
·Name 可选,字符串,代表 Parameter 对象名称。
·Type 可选,长整型值,指定 Parameter 对象数据类型。 bigInt:20;Binary:128;boolean:11;Char:129;BtimeStamp:135;Empty:0;Integer:3;
SmallInt:2;TinyInt:16;VarChar:200;advarchar 202 未编码字符串变量值
·Direction 可选,长整型值,指定 Parameter 对象类型。 0:表示污染确定 ;1:表示输入参数;2:表示输入参数;3:表示输入或输出参数;4:表示返回值
·Size 可选,长整型值,指定参数值最大长度(以字符或字节数为单位)。
·Value 可选,变体型,指定 Parameter 对象值。
CommandType 设置值不同,CommandText的意思也不同:
-1 表明CommandText 参数类型无法确认
1 表明CommandText 参数是一般的命令
2 表明CommandText 参数是一个存在的表名称
4 表明CommandText 参数是一个存在的存储过程
C#调用ODBC连接SQL Server数据库的存储过程
OdbcConnection con = new OdbcConnection("Driver={SQL Server};server=PC-200201070359;uid=sa;pwd=123;database=test;"); try
{
con.Open();
OdbcCommand command = new OdbcCommand();
command.Connection = con;
command.CommandType = CommandType.StoredProcedure;
//command.CommandText = "MaxAge"; //存储过程名称
command.CommandText = "{call MaxAge (?, ?,?)}";
//输入参数
OdbcParameter para = new OdbcParameter("@Name1", OdbcType.NVarChar, 10);
para.Value = "James";
command.Parameters.Add(para);
//输入参数
para = new OdbcParameter("@Name2", OdbcType.NVarChar, 10);
para.Value = "Mary";
command.Parameters.Add(para);
//输出参数(参数名称大小写无关)
para = new OdbcParameter("@MaxAge", OdbcType.Int, 4);
para.Direction = ParameterDirection.Output;
command.Parameters.Add(para);
int i = command.ExecuteNonQuery(); //执行成功返回-1
string k = command.Parameters["@Maxage"].Value.ToString();
}
catch (Exception ex)
{
//throw;
}
可能遇到的问题:
使用ODBC方法,只能方法时会报这样的异常:ERROR [42000] [Microsoft][ODBC SQL Server Driver][SQL Server]过程 ''MaxAge'' 需要参数 ''@Name1'',但未提供该参数。
解决办法:将command.CommandText = "MaxAge"; //存储过程名称 改为 command.CommandText = "{call MaxAge (?, ?,?)}";即可,目前原因未知;前面的方法在sqlclient中是可用的
更多可参看链接:http://www.cnblogs.com/gossip/archive/2009/06/15/1503884.html
C#调用SQL Server中有参数的存储过程
一、使用SqlParameter的方式
代码:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Data.SqlClient; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.Configuration; using System.Collections.ObjectModel; using System.Reflection; namespace ExecuteProcBySQLServer { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void btn_LoadData_Click(object sender, EventArgs e) { // 存储过程名称 string strProcName = "usp_yngr_getInfectionCard_test"; //定义存储过程的参数数组 SqlParameter[] paraValues = { new SqlParameter("@BeginTime",SqlDbType.VarChar), new SqlParameter("@EndTime",SqlDbType.VarChar), new SqlParameter("@DateType",SqlDbType.Int), new SqlParameter("@PtName",SqlDbType.VarChar), new SqlParameter("@PtChartNo",SqlDbType.VarChar), new SqlParameter("@DeptCode",SqlDbType.VarChar), new SqlParameter("@CheckedStatus",SqlDbType.Int) }; // 给存储过程参数数组赋值 paraValues[0].Value = "2017-06-01"; paraValues[1].Value = "2017-07-01"; paraValues[2].Value = 1; paraValues[3].Value = ""; paraValues[4].Value = ""; paraValues[5].Value = ""; paraValues[6].Value = 1; this.dgv_Demo.DataSource = LoadData(strProcName, paraValues); } /// <summary> /// 通过存储过程获取数据 /// </summary> /// <param name="strProcName">存储过程名称</param> /// <param name="paraValues">可变的参数数组 数组的个数可以为0,也可以为多个</param> /// <returns></returns> private DataTable LoadData(string strProcName, params object[] paraValues) { DataTable dt = new DataTable(); string strConn = ConfigurationManager.ConnectionStrings["HealthHospInfection"].ConnectionString; using (SqlConnection conn = new SqlConnection(strConn)) { try { SqlCommand cmd = new SqlCommand(); cmd.CommandText = strProcName; // 设置CommandType的类型 cmd.CommandType = CommandType.StoredProcedure; cmd.Connection = conn; conn.Open(); if (paraValues != null) { //添加参数 cmd.Parameters.AddRange(paraValues); } // 取数据 using (SqlDataAdapter adapter = new SqlDataAdapter(cmd)) { adapter.Fill(dt); } } catch (Exception ex) { MessageBox.Show("错误:" + ex.Message + "/r/n跟踪:" + ex.StackTrace); } finally { conn.Close(); } } return dt; } } }
二、使用SqlCommandBuilder
在上面的例子中,得到一个SqlCommand之后要一个一个地去设置参数,这样很麻烦,幸好SqlCommandBuilder有一个静态的方法:
public static void DeriveParameters(SqlCommand command);
使用这个方法有两个局限性:
- 1、参数必须是SqlCommand。
- 2、该方法只能在调用存储过程的时候使用。
同时还要注意到:在使用的时候,数据库连接必须是打开的。
下面的例子演示如何使用这个方法设置存储过程的参数:
using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.ComponentModel; using System.Configuration; using System.Data; using System.Data.SqlClient; using System.Drawing; using System.Linq; using System.Reflection; using System.Text; using System.Windows.Forms; namespace ExecuteProcBySQLServer { public partial class Form2 : Form { public Form2() { InitializeComponent(); } private void btn_LoadData_Click(object sender, EventArgs e) { // 存储过程名称 string strProcName = "usp_yngr_getInfectionCard_test"; // 定义参数类 object objParams = new { BeginTime = "2017-06-01", EndTime = "2017-07-01", DateType = 1, PtName = "", PtChartNo = "", DeptCode = "", CheckedStatus = 1 }; this.dgv_Demo.DataSource = LoadData(strProcName,objParams); } private DataTable LoadData(string strProcName,object objParams) { DataTable dtInit = new DataTable(); string strConn = ConfigurationManager.ConnectionStrings["HealthHospInfection"].ConnectionString; using (SqlConnection conn = new SqlConnection(strConn)) { try { SqlCommand cmd = new SqlCommand(); cmd.CommandText = strProcName; // 设置CommandType的类型 cmd.CommandType = CommandType.StoredProcedure; cmd.Connection = conn; conn.Open(); // 添加参数 foreach (var item in GetParameters(cmd, objParams)) { cmd.Parameters.Add(item); } // 取数据 using (SqlDataAdapter adapter = new SqlDataAdapter(cmd)) { adapter.Fill(dtInit); } } catch (Exception ex) { MessageBox.Show("错误:" + ex.Message + "/r/n跟踪:" + ex.StackTrace); } finally { conn.Close(); } } return dtInit; } private Collection<SqlParameter> GetParameters(SqlCommand command, object objParam) { Collection<SqlParameter> collection = new Collection<SqlParameter>(); if (objParam != null) { // 使用反射获取属性 PropertyInfo[] properties = objParam.GetType().GetProperties(); SqlCommandBuilder.DeriveParameters(command); //int index = 0; foreach (SqlParameter parameter in command.Parameters) { foreach (PropertyInfo property in properties) { if (("@" + property.Name.ToLower()).Equals(parameter.ParameterName.ToLower())) { parameter.Value = property.GetValue(objParam, null); collection.Add(parameter); } } } // 清空所有参数对象 command.Parameters.Clear(); } return collection; } } }
示例代码下载地址:点此下载
到此这篇关于C#调用SQL Server中有参数存储过程的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持。
- SQL Server存储过程在C#中调用的简单实现方法
- C# Ado.net实现读取SQLServer数据库存储过程列表及参数信息示例
- C#执行存储过程并将结果填充到GridView的方法
- 使用C#代码获取存储过程返回值
- c#获取存储过程返回值示例分享
- C#获取存储过程返回值和输出参数值的方法
- C#中如何执行存储过程方法
- C#中常用的分页存储过程小结
- C#开发Winform程序调用存储过程
今天的关于jdbc和python下调用sqlserver的存储过程和python用jdbc连接数据库的分享已经结束,谢谢您的关注,如果想了解更多关于.net下调用sqlserver存储过程的小例子、ASP 调用sqlserver存储过程学习教程、C#调用ODBC连接SQL Server数据库的存储过程、C#调用SQL Server中有参数的存储过程的相关知识,请在本站进行查询。
本文标签: