Command.CreateParameter 参数说明

本文详细介绍了如何使用ADO的CreateParameter方法来创建参数,并解释了参数的类型及其方向等概念,帮助开发者更好地理解ASP应用程序中存储过程的调用。

    CreateParameter 参数值的类型      2006-03-23 16:19:59
大 中 小
ASP调用sql server 存储过程详解

ado文档对使用指定属性创建新的 Parameter 对象。
语法

Set parameter = command.CreateParameter (Name, Type, Direction, Size, Value)

返回值

返回 Parameter 对象。

参数

Name    可选,字符串,代表 Parameter 对象名称。

Type    可选,长整型值,指定 Parameter 对象数据类型。关于有效设置请参见 Type 属性。

Direction    可选,长整型值,指定 Parameter 对象类型。关于有效设置请参见 Direction 属性。

Size    可选,长整型值,指定参数值最大长度(以字符或字节数为单位)。

Value    可选,变体型,指定 Parameter 对象的值。

说明

使用 CreateParameter 方法可用指定的名称、类型、方向、大小和值创建新的 Parameter 对象。在参数中传送的所有值都将写入相应的 Parameter 属性。

该方法无法自动将 Parameter 对象追加到 Command 对象的 Parameter 集合,这样就可以设置附加属性。如果将 Parameter 对象追加到集合,则 ADO 将使该附加属性的值生效。

如果在 Type 参数中指定可变长度的数据类型,那么在将它追加到 Parameters 集合之前必须传送 Size 参数或者设置 Parameter 对象的 Size 属性环裨蚪砦蟆?br>
================================================================================
参数值的类型的意义如下:

名称值 整数值 功能

adDBTimeStamp 135 日期时间数据类型

adDecimal 14 十进制整数值

adDouble 5 双精度小数值

adError 10 系统错误信息

AdGUID 72 全域性唯一识别字(Globally unique identifier)

adDispath 9 COM/OLE自动对象(Automation Object)

adInteger 3 4字节有符号整数

adIUnknown 13 COM/OLE对象

adLongVarBinary 205 大型2字节值

adLongVarChar 201 大型字符串值

adLongVarWChar 203 大型未编码字符串

adNumeric 131 十进制整数值

adSingle 4 单精度浮点小数

adSmallInt 2 2字节有符号整数

adTinyInt 16 1字节有符号整数

adUnsignedBigInt 21 8字节无符号整数

adUnsignedInt 19 4字节无符号整数

adUnsignedSmallInt 18 2字节无符号整数

adUnsignedTinyInt 17 1字节无符号整数

adUserDefined 132 用户自定义数据类型

adVariant 12 OLE对象

adVarBinary 204 双字节字符变量值

adVarChar 200 字符变量值

advarchar 202 未编码字符串变量值

adWchar 130 未编码字符串

方向值的意义如下:

名称值 整数值 功能  
adParamInput 1 允许数据输入至该参数当中

adParamOutput 2 允许数据输出至该参数当中

adParamInputOutput 3 允许数据输入、输出至该参数当中

adparamReturnValue 4 允许从一子程序中返回数据至该参数当中

Option Explicit ' 数据库连接信息 Const DB_CONNECTION_STRING = "Provider=SQLOLEDB;Data Source=YourServer;Initial Catalog=YourDatabase;User ID=YourUsername;Password=YourPassword" Const DB_TABLE_NAME = "TagHistory" Sub OnLButtonDown(ByVal Item, ByVal Flags, ByVal x, ByVal y) Dim conn, cmd, rs, tagValue, currentTime, sql ' 创建ADO对象 Set conn = CreateObject("ADODB.Connection") Set cmd = CreateObject("ADODB.Command") ' 获取当前时间(UTC格式) currentTime = Now() ' 从WinCC获取Tag1变量值 On Error Resume Next tagValue = HMIRuntime.Tags("Tag1").Read If Err.Number <> 0 Then HMIRuntime.Trace "读取Tag1错误: " & Err.Description & vbCrLf Exit Sub End If On Error GoTo 0 ' 参数化查询防止SQL注入 sql = "INSERT INTO " & DB_TABLE_NAME & " (TagName, TagValue, LogTime) VALUES (?, ?, ?)" On Error Resume Next ' 打开数据库连接 conn.ConnectionString = DB_CONNECTION_STRING conn.Open If Err.Number <> 0 Then HMIRuntime.Trace "数据库连接错误: " & Err.Description & vbCrLf Exit Sub End If ' 使用参数化查询 With cmd .ActiveConnection = conn .CommandText = sql .CommandType = 1 ' adCmdText .Parameters.Append .CreateParameter("TagName", 200, 1, 50, "Tag1") ' adVarChar .Parameters.Append .CreateParameter("TagValue", 200, 1, 255, CStr(tagValue)) .Parameters.Append .CreateParameter("LogTime", 135, 1, , currentTime) ' adDBTimeStamp .Execute End With If Err.Number <> 0 Then HMIRuntime.Trace "写入数据库错误: " & Err.Description & vbCrLf Else HMIRuntime.Trace "数据写入成功: Tag1=" & tagValue & " at " & currentTime & vbCrLf End If ' 清理资源 If conn.State <> 0 Then conn.Close Set cmd = Nothing Set conn = Nothing End Sub
06-16
using System; using System.Collections.Generic; using System.Configuration; using System.Data; using System.Data.Common; using System.Data.SqlClient; using System.Linq; using Oracle.ManagedDataAccess.Client; using MySql.Data.MySqlClient; namespace StorehouseServer.Helper { /// <summary> /// 数据库Helper /// </summary> public class DatabaseHelper : IDisposable { private DbConnection _connection; private readonly DatabaseType _databaseType; private string _connectionString; private const int MaxRetryCount = 3; private const int RetryDelayMs = 1000; public enum DatabaseType { SqlServer, Oracle, MySql } /// <summary> /// 构造函数 /// </summary> /// <param name="databaseType">数据库类型</param> /// <param name="connectionStringName">配置文件中连接字符串的名称</param> /// <exception cref="ArgumentNullException">当connectionStringName为null或空时抛出</exception> /// <exception cref="ConfigurationErrorsException">当连接字符串配置不存在时抛出</exception> public DatabaseHelper(DatabaseType databaseType, string connectionStringName) { if (string.IsNullOrWhiteSpace(connectionStringName)) throw new ArgumentNullException(nameof(connectionStringName), "Connection string name cannot be null or empty."); _databaseType = databaseType; var connectionSettings = ConfigurationManager.ConnectionStrings[connectionStringName]; if (connectionSettings == null) throw new ConfigurationErrorsException($"Connection string '{connectionStringName}' not found in configuration."); // 从配置文件中获取加密的连接字符串并解密 var encryptedConnString = connectionSettings.ConnectionString; if (string.IsNullOrWhiteSpace(encryptedConnString)) throw new ConfigurationErrorsException($"Connection string '{connectionStringName}' is empty."); _connectionString = StringEncryptor.Decrypt(encryptedConnString); // 确保连接字符串包含连接池设置 EnsureConnectionPoolSettings(); } /// <summary> /// 确保连接字符串包含连接池设置 /// </summary> private void EnsureConnectionPoolSettings() { // 根据不同数据库类型添加连接池优化参数 switch (_databaseType) { case DatabaseType.SqlServer: var sqlBuilder = new SqlConnectionStringBuilder(_connectionString) { Pooling = true, MaxPoolSize = 100, MinPoolSize = 5, ConnectTimeout = 15 }; _connectionString = sqlBuilder.ToString(); break; case DatabaseType.Oracle: var oracleBuilder = new OracleConnectionStringBuilder(_connectionString) { Pooling = true, MaxPoolSize = 100, MinPoolSize = 5, ConnectionTimeout = 15 }; _connectionString = oracleBuilder.ToString(); break; case DatabaseType.MySql: var mysqlBuilder = new MySqlConnectionStringBuilder(_connectionString) { Pooling = true, MaximumPoolSize = 100, MinimumPoolSize = 5, ConnectionTimeout = 15 }; _connectionString = mysqlBuilder.ToString(); break; } } /// <summary> /// 初始化数据库连接 /// </summary> private DbConnection InitializeConnection() { DbConnection connection; switch (_databaseType) { case DatabaseType.SqlServer: connection = new SqlConnection(_connectionString); break; case DatabaseType.Oracle: connection = new OracleConnection(_connectionString); break; case DatabaseType.MySql: connection = new MySqlConnection(_connectionString); break; default: throw new ArgumentException("Unsupported database type"); } // 设置连接超时和重试策略 connection.ConnectionString = _connectionString; return connection; } /// <summary> /// 获取数据库连接(带重试机制) /// </summary> public DbConnection GetConnection() { if (_connection == null) { _connection = InitializeConnection(); } // 检查连接状态,必要时重新连接 if (_connection.State != ConnectionState.Open) { int retryCount = 0; while (retryCount < MaxRetryCount) { try { _connection.Open(); return _connection; } catch (DbException) { retryCount++; if (retryCount >= MaxRetryCount) throw; System.Threading.Thread.Sleep(RetryDelayMs); // 尝试重新初始化连接 try { _connection.Dispose(); } catch { } _connection = InitializeConnection(); } } } return _connection; } /// <summary> /// 创建新的数据库连接(不自动打开) /// </summary> public DbConnection CreateConnection() { DbConnection connection; switch (_databaseType) { case DatabaseType.SqlServer: connection = new SqlConnection(_connectionString); break; case DatabaseType.Oracle: connection = new OracleConnection(_connectionString); break; case DatabaseType.MySql: connection = new MySqlConnection(_connectionString); break; default: throw new ArgumentException("Unsupported database type"); } return connection; } /// <summary> /// 执行非查询SQL语句 /// </summary> /// <param name="sql">SQL语句</param> /// <param name="parameters">参数</param> /// <returns>受影响的行数</returns> /// <exception cref="ArgumentNullException">当sql为null或空时抛出</exception> public int ExecuteNonQuery(string sql, params DbParameter[] parameters) { if (string.IsNullOrWhiteSpace(sql)) throw new ArgumentNullException(nameof(sql), "SQL statement cannot be null or empty."); using (var connection = GetConnection()) { using (DbCommand command = CreateCommand(connection, sql, parameters)) { return command.ExecuteNonQuery(); } } } /// <summary> /// 执行查询并返回DataTable /// </summary> /// <param name="sql">SQL语句</param> /// <param name="parameters">参数</param> /// <returns>DataTable结果</returns> /// <exception cref="ArgumentNullException">当sql为null或空时抛出</exception> public DataTable ExecuteDataTable(string sql, params DbParameter[] parameters) { if (string.IsNullOrWhiteSpace(sql)) throw new ArgumentNullException(nameof(sql), "SQL statement cannot be null or empty."); using (var connection = GetConnection()) { using (DbCommand command = CreateCommand(connection, sql, parameters)) { using (DbDataAdapter adapter = CreateDataAdapter(command)) { DataTable dt = new DataTable(); adapter.Fill(dt); return dt; } } } } /// <summary> /// 执行查询并返回DataTable(支持事务) /// </summary> public DataTable ExecuteDataTable(string sql, DbTransaction transaction, params DbParameter[] parameters) { if (string.IsNullOrWhiteSpace(sql)) throw new ArgumentNullException(nameof(sql)); using (DbCommand command = CreateCommand(transaction.Connection, sql, parameters)) { command.Transaction = transaction; using (DbDataAdapter adapter = CreateDataAdapter(command)) { DataTable dt = new DataTable(); adapter.Fill(dt); return dt; } } } /// <summary> /// 执行查询并返回第一行第一列的值 /// </summary> /// <param name="sql">SQL语句</param> /// <param name="parameters">参数</param> /// <returns>结果</returns> /// <exception cref="ArgumentNullException">当sql为null或空时抛出</exception> public object ExecuteScalar(string sql, params DbParameter[] parameters) { if (string.IsNullOrWhiteSpace(sql)) throw new ArgumentNullException(nameof(sql), "SQL statement cannot be null or empty."); using (var connection = GetConnection()) { using (DbCommand command = CreateCommand(connection, sql, parameters)) { return command.ExecuteScalar(); } } } /// <summary> /// 执行查询并返回第一行第一列的值(支持事务) /// </summary> public object ExecuteScalar(string sql, DbTransaction transaction, params DbParameter[] parameters) { using (DbCommand command = CreateCommand(transaction.Connection, sql, parameters)) { command.Transaction = transaction; return command.ExecuteScalar(); } } /// <summary> /// 执行非查询SQL语句(支持事务) /// </summary> /// <param name="sql"></param> /// <param name="transaction"></param> /// <param name="parameters"></param> /// <returns></returns> public int ExecuteNonQuery(string sql, DbTransaction transaction, params DbParameter[] parameters) { using (DbCommand command = CreateCommand(transaction.Connection, sql, parameters)) { command.Transaction = transaction; return command.ExecuteNonQuery(); } } /// <summary> /// 执行存储过程 /// </summary> /// <param name="procedureName">存储过程名称</param> /// <param name="parameters">参数</param> /// <returns>DataTable结果</returns> /// <exception cref="ArgumentNullException">当procedureName为null或空时抛出</exception> public DataTable ExecuteStoredProcedure(string procedureName, params DbParameter[] parameters) { if (string.IsNullOrWhiteSpace(procedureName)) throw new ArgumentNullException(nameof(procedureName), "Procedure name cannot be null or empty."); using (var connection = GetConnection()) { using (DbCommand command = connection.CreateCommand()) { command.CommandText = procedureName; command.CommandType = CommandType.StoredProcedure; if (parameters != null && parameters.Length > 0) { foreach (var param in parameters) { if (param == null) continue; command.Parameters.Add(param); } } using (DbDataAdapter adapter = CreateDataAdapter(command)) { DataTable dt = new DataTable(); adapter.Fill(dt); return dt; } } } } /// <summary> /// 创建数据库命令 /// </summary> private DbCommand CreateCommand(DbConnection connection, string sql, params DbParameter[] parameters) { DbCommand command = connection.CreateCommand(); command.CommandText = sql; command.CommandType = CommandType.Text; if (parameters != null && parameters.Length > 0) { foreach (var param in parameters) { if (param == null) continue; command.Parameters.Add(param); } } return command; } /// <summary> /// 创建数据适配器 /// </summary> private DbDataAdapter CreateDataAdapter(DbCommand command) { switch (_databaseType) { case DatabaseType.SqlServer: return new SqlDataAdapter((SqlCommand)command); case DatabaseType.Oracle: return new OracleDataAdapter((OracleCommand)command); case DatabaseType.MySql: return new MySqlDataAdapter((MySqlCommand)command); default: throw new ArgumentException("Unsupported database type"); } } /// <summary> /// 创建参数 /// </summary> /// <param name="name">参数</param> /// <param name="value">参数</param> /// <param name="dbType">参数类型</param> /// <param name="direction">参数方向</param> /// <returns>DbParameter实例</returns> /// <exception cref="ArgumentNullException">当name为null或空时抛出</exception> public DbParameter CreateParameter(string name, object value, DbType dbType, ParameterDirection direction = ParameterDirection.Input) { if (string.IsNullOrWhiteSpace(name)) throw new ArgumentNullException(nameof(name), "Parameter name cannot be null or empty."); DbParameter parameter; switch (_databaseType) { case DatabaseType.SqlServer: parameter = new SqlParameter(name, value ?? DBNull.Value); break; case DatabaseType.Oracle: parameter = new OracleParameter(name, value ?? DBNull.Value); break; case DatabaseType.MySql: parameter = new MySqlParameter(name, value ?? DBNull.Value); break; default: throw new ArgumentException("Unsupported database type"); } parameter.DbType = dbType; parameter.Direction = direction; return parameter; } /// <summary> /// 开始事务 /// </summary> /// <returns>DbTransaction实例</returns> public DbTransaction BeginTransaction() { var connection = GetConnection(); return connection.BeginTransaction(); } /// <summary> /// 执行事务操作 /// </summary> /// <param name="action">要执行的事务操作</param> /// <exception cref="ArgumentNullException">当action为null时抛出</exception> public void ExecuteInTransaction(Action<DbTransaction> action) { if (action == null) throw new ArgumentNullException(nameof(action), "Action cannot be null."); using (var connection = GetConnection()) { using (var transaction = connection.BeginTransaction()) { try { action(transaction); transaction.Commit(); } catch { try { transaction.Rollback(); } catch (Exception ex) { // 记录日志或处理回滚异常 throw new Exception("Transaction rollback failed.", ex); } throw; } } } } /// <summary> /// 释放资源 /// </summary> public void Dispose() { if (_connection != null) { try { if (_connection.State != ConnectionState.Closed) { _connection.Close(); } _connection.Dispose(); } catch { // 忽略释放过程中的异常 } finally { _connection = null; } } } } } 把这个作为项目的数据库管理通用类 分析可能存在的问题
08-13
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值