×

parameters add

parameters add(C#编程:Parameters的Add方法的参数问题)

admin admin 发表于2023-01-18 02:32:56 浏览68 评论0

抢沙发发表评论

本文目录

C#编程:Parameters的Add方法的参数问题

在c#中执行sql语句时传递参数的小经验

 1、直接写入法:

      例如:     

int Id =1;
             string Name=“lui“;
             cmd.CommandText=“insert into TUserLogin values(“+Id+“,’“+Name+“’)“;

        因为Id是数值,所以在传递的时候只需要在sql字符串中用“+Id+“即可实现,而   Name是字符串,所以在传递的时候还需要在“+Name+“两边各加一个单引号(’)来 实现; 

2、给命令对象添加参数法:

     例如:

int Id =1;
            string Name=“lui“;
            cmd.CommandText=“insert into TUserLogin values(@Id,@Name)“;

          //上条语句中直接在sql语句中写添加的参数名,不论参数类型都是如此.

           SqlParameter  para=new SqlParameter(“@Id“,SqlDbType.int,4);//生成一个名字为@Id的参数,必须以@开头表示是添加的参数,并设置其类型长度,类型长度与数据库中对应字段相同

   para.Value=Id;//给参数赋值
           cmd.Parameters.Add(para);//必须把参数变量添加到命令对象中去。
           //以下类似
           para=new SqlParameter(“@Name“,SqlDbType.VarChar,16);
           para.Value=Name;
           com.Parameters.Add(para);

        ...然后就可以执行数据库操作了。

 SqlParameter用法

SqlParameter parameters = { new SqlParameter(“@a“, “a1“), new SqlParameter(“@b“, “b1“) };
            string strReturn = ““;
            StringBuilder strBulResult = new StringBuilder();
            foreach (SqlParameter parameter in parameters)
            {
                strBulResult.Append(parameter.ParameterName);
                strBulResult.Append(“:“);
                strBulResult.Append(parameter.SqlValue); 
                strBulResult.Append(“\n“); 
            }
       strReturn = strBulResult.ToString();

SqlParameter用法

 

  关于Sql注入的基本概念,相信不需多说,大家都清楚,经典的注入语句是’ or 1=1--

单引号而截断字符串,“or 1=1”的永真式的出现使得表的一些信息被暴露出来,如果sql语句是select * from 的话,可能你整个表的信息都会被读取到,更严重的是,如果恶意使用都使用drop命令,那么可能你的整个数据库得全线崩溃。 

当然,现在重点不是讲sql注入的害处,而是说说如何最大限度的避免注入问题。

 sql注入的存在在最大危害,是sql的执行语句没有和控制语句分开,我们想要select一些东西,但用户可能拼出’ or 1=1甚至再加上delete/update/drop,后来是属于控制语句了,所以要避免sql的注入,就必须把查询语句与控制语句分开。

SqlParameter给我们提供了一个很好的类,有了它,我们可以不现拼接字符串,也可以不再担心单引号带来的惨剧,因为,这一切会有人来为我们完成的。

 

简单的给个示例

传统的查询语句的sql可能为

string sql=“select * from users where user_id=’“+Request.QueryString[“uid“]+“’“;

很显然,我们在这里拼接了字符串,这就给sql注入留下了可乘之机。

现在,我们要改写这样的语句,使用SqlParameter来做 

SqlCommand SqlCmd = new SqlCommand(sql, SqlConn);
SqlParameter _userid = new SqlParameter(“uid“, SqlDbType.Int);
_userid.Value = Request.QueryString[“u_id“];
SqlCmd.Parameters.Add(_userid);

 

这样,我们可以保证外接参数能被正确的转换,单引号这些危险的字符也会转义了,不会再对库造成威胁。

当然,这仅是一个示例而已,在真实的情况下,可能你还要对 Request.QueryString[“u_id“]进行必要的检测与分析,这样才安全

 

所以,使用参数化的sql语句,是一种很好的做法

Dim sql As StringBuilder = New StringBuilder()
            sql.Append(““)
            sql.Append(“SELECT * FROM test“)
            sql.Append(“ WHERE  a= @p1 “)           
 
            Dim command As SqlCommand    =    dac.CreateCommand(sql.ToString())  ’dac为自己写的类
            Dim param As SqlParameter = New SqlParameter()
            param .ParameterName = “@p1“
            param .SqlDbType = SqlDbType.NVarChar
            param .Value = b       ’b为该函数的参数(ByVal b as String)
            command .Parameters.Add(param)
            Dim reader As SqlDataReader = command.ExecuteReader()

SqlParameter 构造函数

 

SqlParameter 构造函数 (String, SqlDbType, Int32, ParameterDirection, Byte, Byte, String, DataRowVersion, Boolean, Object, String, String, String)

初始化 SqlParameter 类的一个新实例,该类使用参数名、参数的类型、参数的长度、方向、精度、小数位数、源列名称、DataRowVersion 值之一、用于源列映射的布尔值、SqlParameter 的值、此 XML 实例的架构集合所在的数据库的名称、此 XML 实例的架构集合所在的关系架构以及此参数的架构集合的名称。

命名空间: System.Data.SqlClient

程序集: System.Data(在 system.data.dll 中)

C#

public SqlParameter (
    string parameterName,
    SqlDbType dbType,
    int size,
    ParameterDirection direction,
    byte precision,
    byte scale,
    string sourceColumn,
    DataRowVersion sourceVersion,
    bool sourceColumnNullMapping,
    Object value,
    string xmlSchemaCollectionDatabase,
    string xmlSchemaCollectionOwningSchema,
    string xmlSchemaCollectionName
)

参数

parameterName

要映射的参数的名称。

dbType

SqlDbType 值之一。 

size

参数的长度。

direction

ParameterDirection 值之一。

precision

要将 Value 解析为的小数点左右两侧的总位数。 

scale

要将 Value 解析为的总小数位数。 

sourceColumn

源列的名称。 

sourceVersion

DataRowVersion 值之一。

sourceColumnNullMapping

如果源列可为空,则为 true;如果不可为空,则为 false。

value

一个 Object,它是 SqlParameter 的值。

xmlSchemaCollectionDatabase

此 XML 实例的架构集合所在的数据库的名称。

xmlSchemaCollectionOwningSchema

包含此 XML 实例的架构集合的关系架构。

xmlSchemaCollectionName

此参数的架构集合的名称。

 备注

如果未在 size 和 precision 参数中显式设置 Size 和 Precision,则从 dbType 参数的值推断出它们。

C#Parameters.Add()如何添加联合主键,或者有其他什么方法

你给他添加两个参数不完事了吗?
cmd.Parameters.Add(“@课程号“....);
cmd.Parameters.Add(“@学号“...);

cmd.Parameters.Add()的用法

SqlDbType表示是数据库里的值类型,
而数据库中没有String类型,只有char,varchar(相当于string),nvarchar(可变长字符串,相当于stringBuider),text
总而言之,string类型在数据库中应当与varChar对应

关于C# Parameters.Add通用类

你有这样的想法很好,但是建议你找一下现在ORM框架的实现,甚至一个简单的都可以,他们是访问model的属性,然后动态的组成sql语句并且传递参数,比你这个方案好得多
我以前写过一个,比如update一个student的时候,通过反射可以获取int的age属性和string的name属性,那么可以动态的生成update set age = @age ,name = @name 接着根据属性类型给正确的sqlparameter值

c#中 cmd.parameters.add() 方法的问题

给命令添加参数呀。如果你没参数,当然可以不用了
就是说,你SQL就如 “update table set a =1 “
还不是 “update table set a=@a“这样的,就不用用

C#的Parameters.Add

C#应用程序与数据交互的时候只是对参数申明类型,然后传值,但是不会进行类型检查。而且传的时候都是用二进制传的,所以无论传的是什么类型的,最后都是二进制,而且在二进制中,数字3和字符3是一样的,数据库拿到这个东西后根据应用程序中申明的类型转换成相应的类型,这时如果转换不了就会出错。楼主举的例子那样写是没问题,但是假如那不是“0.2”,而是一个字母就会报错了。
另外再说说数据类型的问题,不同的程序语言对同一个类型的内存组织不是完全相同的,比如数据库的DbNull和C#中的Null就不是一回事了,更深一步的说是他们在内存中表达形式不一样。

Parameters.Add方法和using System.Data.SqlClient; using System.Data.Common;的关系

using System;
using System.Collections;
using System.Collections.Specialized;
using System.Data;
using System.Data.SqlClient;
using System.Configuration;
using System.Data.Common;
using System.Collections.Generic;
namespace Maticsoft.DBUtility
{
/// 《summary》
/// 数据访问抽象基础类
/// Copyright (C) 2004-2008 By Maticsoft
/// 《/summary》
public abstract class DbHelperSQL
{
//数据库连接字符串(web.config来配置),可以动态更改connectionString支持多数据库.
public static string connectionString = PubConstant.ConnectionString;
public DbHelperSQL()
{
}
#region 公用方法
/// 《summary》
/// 判断是否存在某表的某个字段
/// 《/summary》
/// 《param name=“tableName“》表名称《/param》
/// 《param name=“columnName“》列名称《/param》
/// 《returns》是否存在《/returns》
public static bool ColumnExists(string tableName, string columnName)
{
string sql = “select count(1) from syscolumns where [id]=object_id(’“ + tableName + “’) and [name]=’“ + columnName + “’“;
object res = GetSingle(sql);
if (res == null)
{
return false;
}
return Convert.ToInt32(res) 》 0;
}
public static int GetMaxID(string FieldName, string TableName)
{
string strsql = “select max(“ + FieldName + “)+1 from “ + TableName;
object obj = DbHelperSQL.GetSingle(strsql);
if (obj == null)
{
return 1;
}
else
{
return int.Parse(obj.ToString());
}
}
public static bool Exists(string strSql)
{
object obj = DbHelperSQL.GetSingle(strSql);
int cmdresult;
if ((Object.Equals(obj, null)) || (Object.Equals(obj, System.DBNull.Value)))
{
cmdresult = 0;
}
else
{
cmdresult = int.Parse(obj.ToString());
}
if (cmdresult == 0)
{
return false;
}
else
{
return true;
}
}
/// 《summary》
/// 表是否存在
/// 《/summary》
/// 《param name=“TableName“》《/param》
/// 《returns》《/returns》
public static bool TabExists(string TableName)
{
string strsql = “select count(*) from sysobjects where id = object_id(N’[“ + TableName + “]’) and OBJECTPROPERTY(id, N’IsUserTable’) = 1“;
//string strsql = “SELECT count(*) FROM sys.objects WHERE object_id = OBJECT_ID(N’[dbo].[“ + TableName + “]’) AND type in (N’U’)“;
object obj = DbHelperSQL.GetSingle(strsql);
int cmdresult;
if ((Object.Equals(obj, null)) || (Object.Equals(obj, System.DBNull.Value)))
{
cmdresult = 0;
}
else
{
cmdresult = int.Parse(obj.ToString());
}
if (cmdresult == 0)
{
return false;
}
else
{
return true;
}
}
public static bool Exists(string strSql, params SqlParameter cmdParms)
{
object obj = DbHelperSQL.GetSingle(strSql, cmdParms);
int cmdresult;
if ((Object.Equals(obj, null)) || (Object.Equals(obj, System.DBNull.Value)))
{
cmdresult = 0;
}
else
{
cmdresult = int.Parse(obj.ToString());
}
if (cmdresult == 0)
{
return false;
}
else
{
return true;
}
}
#endregion
#region 执行简单SQL语句
/// 《summary》
/// 执行SQL语句,返回影响的记录数
/// 《/summary》
/// 《param name=“SQLString“》SQL语句《/param》
/// 《returns》影响的记录数《/returns》
public static int ExecuteSql(string SQLString)
{
using (SqlConnection connection = new SqlConnection(connectionString))
{
using (SqlCommand cmd = new SqlCommand(SQLString, connection))
{
try
{
connection.Open();
int rows = cmd.ExecuteNonQuery();
return rows;
}
catch (System.Data.SqlClient.SqlException e)
{
connection.Close();
throw e;
}
}
}
}
public static int ExecuteSqlByTime(string SQLString, int Times)
{
using (SqlConnection connection = new SqlConnection(connectionString))
{
using (SqlCommand cmd = new SqlCommand(SQLString, connection))
{
try
{
connection.Open();
cmd.CommandTimeout = Times;
int rows = cmd.ExecuteNonQuery();
return rows;
}
catch (System.Data.SqlClient.SqlException e)
{
connection.Close();
throw e;
}
}
}
}

/// 《summary》
/// 执行Sql和Oracle滴混合事务
/// 《/summary》
/// 《param name=“list“》SQL命令行列表《/param》
/// 《param name=“oracleCmdSqlList“》Oracle命令行列表《/param》
/// 《returns》执行结果 0-由于SQL造成事务失败 -1 由于Oracle造成事务失败 1-整体事务执行成功《/returns》
public static int ExecuteSqlTran(List《CommandInfo》 list, List《CommandInfo》 oracleCmdSqlList)
{
using (SqlConnection conn = new SqlConnection(connectionString))
{
conn.Open();
SqlCommand cmd = new SqlCommand();
cmd.Connection = conn;
SqlTransaction tx = conn.BeginTransaction();
cmd.Transaction = tx;
try
{
foreach (CommandInfo myDE in list)
{
string cmdText = myDE.CommandText;
SqlParameter cmdParms = (SqlParameter)myDE.Parameters;
PrepareCommand(cmd, conn, tx, cmdText, cmdParms);
if (myDE.EffentNextType == EffentNextType.SolicitationEvent)
{
if (myDE.CommandText.ToLower().IndexOf(“count(“) == -1)
{
tx.Rollback();
throw new Exception(“违背要求“+myDE.CommandText+“必须符合select count(..的格式“);
//return 0;
}
object obj = cmd.ExecuteScalar();
bool isHave = false;
if (obj == null && obj == DBNull.Value)
{
isHave = false;
}
isHave = Convert.ToInt32(obj) 》 0;
if (isHave)
{
//引发事件
myDE.OnSolicitationEvent();
}
}
if (myDE.EffentNextType == EffentNextType.WhenHaveContine || myDE.EffentNextType == EffentNextType.WhenNoHaveContine)
{
if (myDE.CommandText.ToLower().IndexOf(“count(“) == -1)
{
tx.Rollback();
throw new Exception(“SQL:违背要求“ + myDE.CommandText + “必须符合select count(..的格式“);
//return 0;
}
object obj = cmd.ExecuteScalar();
bool isHave = false;
if (obj == null && obj == DBNull.Value)
{
isHave = false;
}
isHave = Convert.ToInt32(obj) 》 0;
if (myDE.EffentNextType == EffentNextType.WhenHaveContine && !isHave)
{
tx.Rollback();
throw new Exception(“SQL:违背要求“ + myDE.CommandText + “返回值必须大于0“);
//return 0;
}
if (myDE.EffentNextType == EffentNextType.WhenNoHaveContine && isHave)
{
tx.Rollback();
throw new Exception(“SQL:违背要求“ + myDE.CommandText + “返回值必须等于0“);
//return 0;
}
continue;
}
int val = cmd.ExecuteNonQuery();
if (myDE.EffentNextType == EffentNextType.ExcuteEffectRows && val == 0)
{
tx.Rollback();
throw new Exception(“SQL:违背要求“ + myDE.CommandText + “必须有影响行“);
//return 0;
}
cmd.Parameters.Clear();
}
string oraConnectionString = PubConstant.GetConnectionString(“ConnectionStringPPC“);
bool res = OracleHelper.ExecuteSqlTran(oraConnectionString, oracleCmdSqlList);
if (!res)
{
tx.Rollback();
throw new Exception(“Oracle执行失败“);
// return -1;
}
tx.Commit();
return 1;
}
catch (System.Data.SqlClient.SqlException e)
{
tx.Rollback();
throw e;
}
catch (Exception e)
{
tx.Rollback();
throw e;
}
}
}
/// 《summary》
/// 执行多条SQL语句,实现数据库事务。
/// 《/summary》
/// 《param name=“SQLStringList“》多条SQL语句《/param》
public static int ExecuteSqlTran(List《String》 SQLStringList)
{
using (SqlConnection conn = new SqlConnection(connectionString))
{
conn.Open();
SqlCommand cmd = new SqlCommand();
cmd.Connection = conn;
SqlTransaction tx = conn.BeginTransaction();
cmd.Transaction = tx;
try
{
int count = 0;
for (int n = 0; n 《 SQLStringList.Count; n++)
{
string strsql = SQLStringList[n];
if (strsql.Trim().Length 》 1)
{
cmd.CommandText = strsql;
count += cmd.ExecuteNonQuery();
}
}
tx.Commit();
return count;
}
catch
{
tx.Rollback();
return 0;
}
}
}
/// 《summary》
/// 执行带一个存储过程参数的的SQL语句。
/// 《/summary》
/// 《param name=“SQLString“》SQL语句《/param》
/// 《param name=“content“》参数内容,比如一个字段是格式复杂的文章,有特殊符号,可以通过这个方式添加《/param》
/// 《returns》影响的记录数《/returns》
public static int ExecuteSql(string SQLString, string content)
{
using (SqlConnection connection = new SqlConnection(connectionString))
{
SqlCommand cmd = new SqlCommand(SQLString, connection);
System.Data.SqlClient.SqlParameter myParameter = new System.Data.SqlClient.SqlParameter(“@content“, SqlDbType.NText);
myParameter.Value = content;
cmd.Parameters.Add(myParameter);
try
{
connection.Open();
int rows = cmd.ExecuteNonQuery();
return rows;
}
catch (System.Data.SqlClient.SqlException e)
{
throw e;
}
finally
{
cmd.Dispose();
connection.Close();
}
}
}

c#中Parameters.Add(,)

Add()将具有指定值的 DbParameter 项添加到 DbParameterCollection。
类似这样:
parameter = new SqlParameter(“@name“,SqlDbType.VarChar,10);
//定义SqlParameter对象,并指定类型
parameter.Value =txtName.Text;
//赋值
cmd.Parameters.Add(parameter);
//填入SqlCommand

Parameters.Add和Parameters.AddWithValue有什么区别

参考1:所以我的做法是在能用AddWithValue的时候就用他
paramNames:参数的数组
for (int i = 0; i 《 paramNames.Count; i++)
{
if (objParamValues[i].GetType().ToString() == “System.DateTime“)
{//是时间类型,用Add替换
OleDbParameter p = new OleDbParameter();
p.ParameterName = paramNames[i];
p.OleDbType = OleDbType.Date;
p.Value = objParamValues[i];
cmd.Parameters.Add(p);
}
else
cmd.Parameters.AddWithValue(paramNames[i], objParamValues[i]);
}