SqlHelper类中提供了三种可以用来管理SqlParameter参数的共享方法。下面来一一讲解:
1、CacheParameterSet
将SqlParameter参数数组存储到本地缓存中
2、GetCacheParameterSet
用于读取缓存中的SqlParameter数组,和上面CacheParameterSet组合使用
3、GetSpSqlparameter
一种重载方法,用于检索指定存储过程中的相应参数(首先查询一次数据库,然后缓存结果,以便将来查询),该方法从缓存中检索存储过程的参数,如果存储过程中没有,那么就从.NET 的 SqlCommandBuilder 类从内部检索,并将它们添加到缓存中,以便用于后续的检索请求。然后,为每个参数指定相应的参数设置(将参数值设置为DBNull.Value),最后将这些参数以数组形式返回给客户端。
SqlHelper中SqlHelperParameterCache类的用法介绍
标签:net 缓存 str 数组 指定 介绍 man gets psql
小编还为您整理了以下内容,可能对您也有帮助:
sqlhelper是干什么的
SqlHelper是一个基于.NET Framework的数据库操作组件。组件中包含数据库操作方法,目前SqlHelper有很多版本,主要以微软一开始发布的SqlHelper类,后面包含进了Enterprise Library开源包中了。还有一个主要版本是dbhelper.org开源的sqlhelper组件,优点是简洁,高性能,不仅仅支持sqlserver,同时支持sqlserver、oracle、access、Mysql数据库,也是一个开源项目,提供免费下载。 SqlHelper用于简化你重复的去写那些数据库连接(SqlConnection),SqlCommand,SqlDataReader等等。SqlHelper 封装过后通常是只需要给方法传入一些参数如数据库连接字符串,SQL参数等,就可以访问数据库了,很方便。 SqlHelper 类用于通过一组静态方法来封装数据访问功能。该类不能被继承或实例化,因此将其声明为包含专用构造函数的不可继承类。在 SqlHelper 类中实现的每种方法都提供了一组一致的重载。这提供了一种很好的使用 SqlHelper 类来执行命令的模式,同时为开发人员选择访问数据的方式提供了必要的灵活性。每种方法的重载都支持不同的方法参数,因此开发人员可以确定传递连接、事务和参数信息的方式。
请给一段C#类在winform中的代码示例,说明类怎么使用?
实体类
public class PhoneBook
{
private string name;
private string phone;
private struct address
{
public string city;
public string street;
public uint no;
}
public string Phone
{
get{
return phone;
}
set{
phone=value;
}
}
public PhoneBook(string n){
name=n;
}
}
方法对方法类SqlHelper的方法ExecuteNonQuery的调用
public static bool do()
{
PhoneBook pb=new PhoneBook();
boolean state = false;
try {
String[] parms = {【参数区(如果类型为非String型,则"" + 变量)】};
int i = SQLHelper.ExecuteNonQuery(【SQL语句】, parms『可为null』);
if (i == 1) {
state = true;
//实体类调用
pb.Phone= i;
}
} catch (Exception e) {
e.printStackTrace();
}
return state;
}
下面是类
public abstract class SqlHelper {
//Database connection strings
public static readonly string ConnectionStringLocalTransaction = ConfigurationManager.ConnectionStrings["SQLConnString1"].ConnectionString;
private static Hashtable parmCache = Hashtable.Synchronized(new Hashtable());
public static int ExecuteNonQuery(string connectionString, CommandType cmdType, string cmdText, params SqlParameter[] commandParameters) {
SqlCommand cmd = new SqlCommand();
using (SqlConnection conn = new SqlConnection(connectionString)) {
PrepareCommand(cmd, conn, null, cmdType, cmdText, commandParameters);
int val = cmd.ExecuteNonQuery();
cmd.Parameters.Clear();
return val;
}
}
public static int ExecuteNonQuery(SqlConnection connection, CommandType cmdType, string cmdText, params SqlParameter[] commandParameters) {
SqlCommand cmd = new SqlCommand();
PrepareCommand(cmd, connection, null, cmdType, cmdText, commandParameters);
int val = cmd.ExecuteNonQuery();
cmd.Parameters.Clear();
return val;
}
public static int ExecuteNonQuery(SqlTransaction trans, CommandType cmdType, string cmdText, params SqlParameter[] commandParameters) {
SqlCommand cmd = new SqlCommand();
PrepareCommand(cmd, trans.Connection, trans, cmdType, cmdText, commandParameters);
int val = cmd.ExecuteNonQuery();
cmd.Parameters.Clear();
return val;
}
public static SqlDataReader ExecuteReader(string connectionString, CommandType cmdType, string cmdText, params SqlParameter[] commandParameters) {
SqlCommand cmd = new SqlCommand();
SqlConnection conn = new SqlConnection(connectionString);
try {
PrepareCommand(cmd, conn, null, cmdType, cmdText, commandParameters);
SqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
cmd.Parameters.Clear();
return rdr;
}
catch {
conn.Close();
throw;
}
}
public static object ExecuteScalar(string connectionString, CommandType cmdType, string cmdText, params SqlParameter[] commandParameters) {
SqlCommand cmd = new SqlCommand();
using (SqlConnection connection = new SqlConnection(connectionString)) {
PrepareCommand(cmd, connection, null, cmdType, cmdText, commandParameters);
object val = cmd.ExecuteScalar();
cmd.Parameters.Clear();
return val;
}
}
public static object ExecuteScalar(SqlConnection connection, CommandType cmdType, string cmdText, params SqlParameter[] commandParameters) {
SqlCommand cmd = new SqlCommand();
PrepareCommand(cmd, connection, null, cmdType, cmdText, commandParameters);
object val = cmd.ExecuteScalar();
cmd.Parameters.Clear();
return val;
}
public static void CacheParameters(string cacheKey, params SqlParameter[] commandParameters) {
parmCache[cacheKey] = commandParameters;
}
public static SqlParameter[] GetCachedParameters(string cacheKey) {
SqlParameter[] cachedParms = (SqlParameter[])parmCache[cacheKey];
if (cachedParms == null)
return null;
SqlParameter[] clonedParms = new SqlParameter[cachedParms.Length];
for (int i = 0, j = cachedParms.Length; i < j; i++)
clonedParms[i] = (SqlParameter)((ICloneable)cachedParms[i]).Clone();
return clonedParms;
}
private static void PrepareCommand(SqlCommand cmd, SqlConnection conn, SqlTransaction trans, CommandType cmdType, string cmdText, SqlParameter[] cmdParms) {
if (conn.State != ConnectionState.Open)
conn.Open();
cmd.Connection = conn;
cmd.CommandText = cmdText;
if (trans != null)
cmd.Transaction = trans;
cmd.CommandType = cmdType;
if (cmdParms != null) {
foreach (SqlParameter parm in cmdParms)
cmd.Parameters.Add(parm);
}
}
}
怎么解决sqlhelper 连接超时的问题
‘在验证数据时进行
Me.txtRemark.Trim()
‘在保存时进行
With info
If (Me.txtRemark.HasValue) Then
.Remark = Me.txtRemark.Text
Else
.Remark = Nothing
End If
End With
这段代码并不难理解,不过需要说明的是,必填的字段为了验证是否有值Trim是得有的,而不必填的字段实质上则只需要赋值的那一行,Trim和Null则可以交由底层SqlHelper里进行处理。
首先我们定义一个配置类来进行控制:
‘‘‘ <summary>
‘‘‘ Database configuration
‘‘‘ </summary>
Friend NotInheritable Class Config
‘ Removes all occurrences of white space characters
Public Shared ReadOnly TrimString As Boolean = True
‘ translate the empty string to null
Public Shared ReadOnly EmptyStringToNull As Boolean = True
‘ translate the null boolean to false
Public Shared ReadOnly NullBooleanToFalse As Boolean = True
‘ translate the null value to dbnull value
Public Shared ReadOnly NullValueToDBNull As Boolean = True
End Class
前三项正是我们要实现的功能的开关,而最后一项NullValueToDBNull则需要另外说明一下了:
在实体类中,值类型我都是用Nullable(Of T)来存储的,这当中就包含了Null的情况,而在传递至数据库时,Null是作为默认值还是DBNull呢?这是不确定的,所以这个开关就是用于约定Null作为DBNull处理。
接下来就是对SqlHelper的改造了,需要改动的只有一个方法:PrepareCommand
‘‘‘ <summary>
‘‘‘ This method opens (if necessary) and assigns a connection, transaction, command type and parameters
‘‘‘ to the provided command.
‘‘‘ </summary>
‘‘‘ <param name="command">the SqlCommand to be prepared</param>
‘‘‘ <param name="connection">a valid SqlConnection, on which to execute this command</param>
‘‘‘ <param name="transaction">a valid SqlTransaction, or ‘null‘</param>
‘‘‘ <param name="commandType">the CommandType (stored procedure, text, etc.)</param>
‘‘‘ <param name="commandText">the stored procedure name or T-SQL command</param>
‘‘‘ <param name="commandParameters">an array of SqlParameters to be associated with the command or ‘null‘ if no parameters are required</param>
Private Shared Sub PrepareCommand(ByVal command As SqlCommand, _
ByVal connection As SqlConnection, _
ByVal transaction As SqlTransaction, _
ByVal commandType As CommandType, _
ByVal commandText As String, _
ByVal commandParameters() As SqlParameter)
‘if the provided connection is not open, we will open it
If connection.State <> ConnectionState.Open Then
connection.Open()
End If
‘associate the connection with the command
command.Connection = connection
‘set the command text (stored procedure name or SQL statement)
command.CommandText = commandText
‘if we were provided a transaction, assign it.
If Not (transaction Is Nothing) Then
command.Transaction = transaction
End If
‘set the command type
command.CommandType = commandType
‘attach the command parameters if they are provided
If Not (commandParameters Is Nothing) Then
For Each p As SqlParameter In commandParameters
If (p.Direction <> ParameterDirection.Output) Then
Select Case p.DbType
Case DbType.String, DbType.StringFixedLength, DbType.AnsiString, DbType.AnsiStringFixedLength
If (Not p.Value Is Nothing AndAlso Not p.Value Is DBNull.Value) Then
Dim str As String = p.Value.ToString()
If (Config.TrimString) Then
str = str.Trim()
End If
If (Config.EmptyStringToNull AndAlso str.Length = 0) Then
str = Nothing
End If
p.Value = str
End If
Case DbType.Boolean
If (Config.NullBooleanToFalse AndAlso p.Value Is Nothing) Then
p.Value = False
End If
End Select
If (Config.NullValueToDBNull AndAlso p.Value Is Nothing) Then
p.Value = DBNull.Value
End If
End If
command.Parameters.Add(p)
Next
End If
End Sub ‘PrepareCommand
可以看到根据Parameter的DbType作了相应的处理,这样处理后,非必填的字段,就只以只用一句赋值语句,剩下的去空白字符和Null判断就交由底层处理了,省心省力!~~~
使用SqlHelper的一个小技巧
标签:
怎么解决sqlhelper 连接超时的问题
‘在验证数据时进行
Me.txtRemark.Trim()
‘在保存时进行
With info
If (Me.txtRemark.HasValue) Then
.Remark = Me.txtRemark.Text
Else
.Remark = Nothing
End If
End With
这段代码并不难理解,不过需要说明的是,必填的字段为了验证是否有值Trim是得有的,而不必填的字段实质上则只需要赋值的那一行,Trim和Null则可以交由底层SqlHelper里进行处理。
首先我们定义一个配置类来进行控制:
‘‘‘ <summary>
‘‘‘ Database configuration
‘‘‘ </summary>
Friend NotInheritable Class Config
‘ Removes all occurrences of white space characters
Public Shared ReadOnly TrimString As Boolean = True
‘ translate the empty string to null
Public Shared ReadOnly EmptyStringToNull As Boolean = True
‘ translate the null boolean to false
Public Shared ReadOnly NullBooleanToFalse As Boolean = True
‘ translate the null value to dbnull value
Public Shared ReadOnly NullValueToDBNull As Boolean = True
End Class
前三项正是我们要实现的功能的开关,而最后一项NullValueToDBNull则需要另外说明一下了:
在实体类中,值类型我都是用Nullable(Of T)来存储的,这当中就包含了Null的情况,而在传递至数据库时,Null是作为默认值还是DBNull呢?这是不确定的,所以这个开关就是用于约定Null作为DBNull处理。
接下来就是对SqlHelper的改造了,需要改动的只有一个方法:PrepareCommand
‘‘‘ <summary>
‘‘‘ This method opens (if necessary) and assigns a connection, transaction, command type and parameters
‘‘‘ to the provided command.
‘‘‘ </summary>
‘‘‘ <param name="command">the SqlCommand to be prepared</param>
‘‘‘ <param name="connection">a valid SqlConnection, on which to execute this command</param>
‘‘‘ <param name="transaction">a valid SqlTransaction, or ‘null‘</param>
‘‘‘ <param name="commandType">the CommandType (stored procedure, text, etc.)</param>
‘‘‘ <param name="commandText">the stored procedure name or T-SQL command</param>
‘‘‘ <param name="commandParameters">an array of SqlParameters to be associated with the command or ‘null‘ if no parameters are required</param>
Private Shared Sub PrepareCommand(ByVal command As SqlCommand, _
ByVal connection As SqlConnection, _
ByVal transaction As SqlTransaction, _
ByVal commandType As CommandType, _
ByVal commandText As String, _
ByVal commandParameters() As SqlParameter)
‘if the provided connection is not open, we will open it
If connection.State <> ConnectionState.Open Then
connection.Open()
End If
‘associate the connection with the command
command.Connection = connection
‘set the command text (stored procedure name or SQL statement)
command.CommandText = commandText
‘if we were provided a transaction, assign it.
If Not (transaction Is Nothing) Then
command.Transaction = transaction
End If
‘set the command type
command.CommandType = commandType
‘attach the command parameters if they are provided
If Not (commandParameters Is Nothing) Then
For Each p As SqlParameter In commandParameters
If (p.Direction <> ParameterDirection.Output) Then
Select Case p.DbType
Case DbType.String, DbType.StringFixedLength, DbType.AnsiString, DbType.AnsiStringFixedLength
If (Not p.Value Is Nothing AndAlso Not p.Value Is DBNull.Value) Then
Dim str As String = p.Value.ToString()
If (Config.TrimString) Then
str = str.Trim()
End If
If (Config.EmptyStringToNull AndAlso str.Length = 0) Then
str = Nothing
End If
p.Value = str
End If
Case DbType.Boolean
If (Config.NullBooleanToFalse AndAlso p.Value Is Nothing) Then
p.Value = False
End If
End Select
If (Config.NullValueToDBNull AndAlso p.Value Is Nothing) Then
p.Value = DBNull.Value
End If
End If
command.Parameters.Add(p)
Next
End If
End Sub ‘PrepareCommand
可以看到根据Parameter的DbType作了相应的处理,这样处理后,非必填的字段,就只以只用一句赋值语句,剩下的去空白字符和Null判断就交由底层处理了,省心省力!~~~
使用SqlHelper的一个小技巧
标签:
ASP.NET 中 SqlParameter是什么?具体怎么用
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 参数的值推断出它们。
SqlParameter 类
表示 SqlCommand 的参数,也可以是它到 DataSet 列的映射。无法继承此类。
有关此类型所有成员的列表,请参阅 SqlParameter 成员。
System.Object
System.MarshalByRefObject
System.Data.SqlClient.SqlParameter
[Visual Basic]
NotInheritable Public Class SqlParameter
Inherits MarshalByRefObject
Implements IDbDataParameter, IDataParameter, ICloneable
[C#]
public sealed class SqlParameter : MarshalByRefObject,
IDbDataParameter, IDataParameter, ICloneable
[C++]
public __gc __sealed class SqlParameter : public
MarshalByRefObject, IDbDataParameter, IDataParameter, ICloneable
[JScript]
public class SqlParameter extends MarshalByRefObject implements
IDbDataParameter, IDataParameter, ICloneable
线程安全
此类型的所有公共静态(Visual Basic 中为 Shared)成员是线程安全的。但不保证任何实例成员是线程安全的。
备注
参数名称不区分大小写。
示例
[Visual Basic, C#, C++] 下面的示例通过 SqlDataAdapter 中的 SqlParameterCollection 集合创建 SqlParameter 的多个实例。这些参数用于从数据源中选择数据并将数据放在 DataSet 中。此示例假定已经用适当的架构、命令和连接创建了 DataSet 和 SqlDataAdapter。
[Visual Basic]
Public Sub AddSqlParameters()
' ...
' create myDataSet and myDataAdapter
' ...
myDataAdapter.SelectCommand.Parameters.Add("@CategoryName", SqlDbType.VarChar, 80).Value = "toasters"
myDataAdapter.SelectCommand.Parameters.Add("@SerialNum", SqlDbType.Int).Value = 239
myDataAdapter.Fill(myDataSet)
End Sub 'AddSqlParameters
[C#]
public void AddSqlParameters()
{
// ...
// create myDataSet and myDataAdapter
// ...
myDataAdapter.SelectCommand.Parameters.Add("@CategoryName", SqlDbType.VarChar, 80).Value = "toasters";
myDataAdapter.SelectCommand.Parameters.Add("@SerialNum", SqlDbType.Int).Value = 239;
myDataAdapter.Fill(myDataSet);
}
[C++]
public:
void AddSqlParameters()
{
// ...
// create myDataSet and myDataAdapter
// ...
myDataAdapter->SelectCommand->Parameters->Add(S"@CategoryName", SqlDbType::VarChar, 80)->Value = S"toasters";
myDataAdapter->SelectCommand->Parameters->Add(S"@SerialNum", SqlDbType::Int)->Value = __box(239);
myDataAdapter->Fill(myDataSet);
}
[JScript] 没有可用于 JScript 的示例。若要查看 Visual Basic、C# 或 C++ 示例,请单击页左上角的“语言筛选器”按钮 。
要求
命名空间: System.Data.SqlClient
平台: Windows 98, Windows NT 4.0, Windows ME, Windows 2000, Windows XP Home Edition, Windows XP Professional, Windows Server 2003 系列, .NET Framework 精简版
程序集: System.Data (在 System.Data.dll 中)
使用SqlParameter
SqlParameter[] p =
{
SqlHelper.MakeInParam("@EntryID",SqlDbType.Int,4,ev.EntryID),
SqlHelper.MakeInParam("@BlogID",SqlDbType.Int,4,ev.BlogID),
SqlHelper.MakeInParam("@URL",SqlDbType.NVarChar,255,DataHelper.CheckNull(ev.ReferralUrl)),
SqlHelper.MakeInParam("@IsWeb",SqlDbType.Bit,1,ev.PageViewType)
};
SqlHelper.ExecuteNonQuery(conn,CommandType.StoredProcere,"blog_TrackEntry",p);
答疑:SqlParameter赋值之后怎么添加值
用SqlCommand我知道用add
但我想问的是 SqlParameter
例如
SqlParameter parm = new SqlParameter(PARM_ORDER_ID, SqlDbType.Int);
parm.Value = orderId;
之后能不能再改parm添加一个值
因为我写了个方法是传递SqlParameter类型的参数
但有时要做些判断
像
SqlParameter parm = new SqlParameter(PARM_ORDER_ID, SqlDbType.Int);
parm.Value = orderId;
if(...)
{
//添加一个参数
}
ExecuteReader(parm,.....);
请问应该怎么做呢
最佳答案 int IArticle.Insert(ArticleInfo article)
{
//如果对象存在
if (article.ID != -1)
return -1;
else
article.ID = TableHelper.GetSequence(SQLHelper.ConnectionString, "Article", "ID");
//统计执行成功的数量
int successCount = 0;
string SQL_THIS = SQL_INSERT_ARTICLE;
SqlParameter[] paras = GetParas();
paras[0].Value = article.ID;
paras[1].Value = article.Title;
paras[2].Value = article.DateAdded;
paras[3].Value = article.Text;
paras[4].Value = article.SourceUrl;
paras[5].Value = article.PostType;
paras[6].Value = article.Author;
paras[7].Value = article.Email;
paras[8].Value = article.SourceName;
paras[9].Value = article.BlogID;
paras[10].Value = article.CategoryID;
paras[11].Value = article.Summary;
paras[12].Value = article.IsBySummary;
paras[13].Value = article.DateUpdated;
paras[14].Value = article.TitleUrl;
paras[15].Value = article.FeedBackCount;
paras[16].Value = article.PostConfig;
paras[17].Value = article.EntryName;
paras[18].Value = article.KeyWord;
SqlConnection conn = new SqlConnection(SQLHelper.ConnectionString);
successCount = SQLHelper.ExecuteNonQuery(conn, CommandType.Text, SQL_THIS, paras);
return successCount;
}
.net/vb.net/c#的sqlhelper里面,commandParameter.ParameterName.Substring(1)什么意思?
这里的Substring(1)的意思是从索引为1的开始截取一直截取到最后。
比如你获取的commandParameter.ParameterName这个字符串的值是abcd;
那么上面的写法就是从索引为1的地方开始截取,索引是从0开始计算的,那么就是说字符串"abcd"索引0的位置是a,那么从1开始截取就是从b开始截取,一直截取到最后。
那么这样最后截取下来的字符串就是bcd.
substring(int beginIndex, int endIndex) 这个是substring另外一个方法,这2个参数第一个是开始截取的位置,比如你输入1,那么就是从索引b的位置开始截取,后面的参数是截取结束的位置,如果你输入2,那就是截取到c就结束了,最后截取下来的字符串就是bc.
你自己可以测试下;
先定义个字符串
string str="asdfasdfasdf";//随便怎么定义
string str2="";
然后str2=str.substring(5)//这里是从索引为5的地方开始截取,一直截取到最后。
str2=str.substring(3,10)//这里是从索引3的地方开始截取,一直截取到索引为10的位置结束。