本文整理汇总了C#中System.Data.SqlClient.TdsParserStateObject.SetTimeoutSeconds方法的典型用法代码示例。如果您正苦于以下问题:C# TdsParserStateObject.SetTimeoutSeconds方法的具体用法?C# TdsParserStateObject.SetTimeoutSeconds怎么用?C# TdsParserStateObject.SetTimeoutSeconds使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类System.Data.SqlClient.TdsParserStateObject
的用法示例。
在下文中一共展示了TdsParserStateObject.SetTimeoutSeconds方法的7个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C#代码示例。
示例1: TdsExecuteSQLBatch
internal Task TdsExecuteSQLBatch(string text, int timeout, TdsParserStateObject stateObj, bool sync, bool callerHasConnectionLock = false)
{
if (TdsParserState.Broken == State || TdsParserState.Closed == State)
{
return null;
}
if (stateObj.BcpLock)
{
throw SQL.ConnectionLockedForBcpEvent();
}
// Promote, Commit and Rollback requests for
// delegated transactions often happen while there is an open result
// set, so we need to handle them by using a different MARS session,
// otherwise we'll write on the physical state objects while someone
// else is using it. When we don't have MARS enabled, we need to
// lock the physical state object to syncronize it's use at least
// until we increment the open results count. Once it's been
// incremented the delegated transaction requests will fail, so they
// won't stomp on anything.
// Only need to take the lock if neither the thread nor the caller claims to already have it
bool needToTakeParserLock = (!callerHasConnectionLock) && (!_connHandler.ThreadHasParserLockForClose);
Debug.Assert(!_connHandler.ThreadHasParserLockForClose || sync, "Thread shouldn't claim to have the parser lock if we are doing async writes"); // Since we have the possibility of pending with async writes, make sure the thread doesn't claim to already have the lock
Debug.Assert(needToTakeParserLock || _connHandler._parserLock.ThreadMayHaveLock(), "Thread or caller claims to have connection lock, but lock is not taken");
bool releaseConnectionLock = false;
if (needToTakeParserLock)
{
_connHandler._parserLock.Wait(canReleaseFromAnyThread: !sync);
releaseConnectionLock = true;
}
// Switch the writing mode
// NOTE: We are not turning off async writes when we complete since SqlBulkCopy uses this method and expects _asyncWrite to not change
_asyncWrite = !sync;
try
{
// Check that the connection is still alive
if ((_state == TdsParserState.Closed) || (_state == TdsParserState.Broken))
{
throw ADP.ClosedConnectionError();
}
stateObj.SetTimeoutSeconds(timeout);
stateObj.SniContext = SniContext.Snix_Execute;
WriteRPCBatchHeaders(stateObj);
stateObj._outputMessageType = TdsEnums.MT_SQL;
WriteString(text, text.Length, 0, stateObj);
Task executeTask = stateObj.ExecuteFlush();
if (executeTask == null)
{
stateObj.SniContext = SniContext.Snix_Read;
}
else
{
Debug.Assert(!sync, "Should not have gotten a Task when writing in sync mode");
// Need to wait for flush - continuation will unlock the connection
bool taskReleaseConnectionLock = releaseConnectionLock;
releaseConnectionLock = false;
return executeTask.ContinueWith(t =>
{
Debug.Assert(!t.IsCanceled, "Task should not be canceled");
try
{
if (t.IsFaulted)
{
FailureCleanup(stateObj, t.Exception.InnerException);
throw t.Exception.InnerException;
}
else
{
stateObj.SniContext = SniContext.Snix_Read;
}
}
finally
{
if (taskReleaseConnectionLock)
{
_connHandler._parserLock.Release();
}
}
}, TaskScheduler.Default);
}
// Finished sync
return null;
}
catch (Exception e)
{
if (!ADP.IsCatchableExceptionType(e))
{
//.........这里部分代码省略.........
示例2: TdsExecuteRPC
internal Task TdsExecuteRPC(_SqlRPC[] rpcArray, int timeout, bool inSchema, TdsParserStateObject stateObj, bool isCommandProc, bool sync = true,
TaskCompletionSource<object> completion = null, int startRpc = 0, int startParam = 0)
{
bool firstCall = (completion == null);
bool releaseConnectionLock = false;
Debug.Assert(!firstCall || startRpc == 0, "startRpc is not 0 on first call");
Debug.Assert(!firstCall || startParam == 0, "startParam is not 0 on first call");
Debug.Assert(!firstCall || !_connHandler.ThreadHasParserLockForClose, "Thread should not already have connection lock");
Debug.Assert(firstCall || _connHandler._parserLock.ThreadMayHaveLock(), "Connection lock not taken after the first call");
try
{
_SqlRPC rpcext = null;
int tempLen;
// Promote, Commit and Rollback requests for
// delegated transactions often happen while there is an open result
// set, so we need to handle them by using a different MARS session,
// otherwise we'll write on the physical state objects while someone
// else is using it. When we don't have MARS enabled, we need to
// lock the physical state object to syncronize it's use at least
// until we increment the open results count. Once it's been
// incremented the delegated transaction requests will fail, so they
// won't stomp on anything.
if (firstCall)
{
_connHandler._parserLock.Wait(canReleaseFromAnyThread: !sync);
releaseConnectionLock = true;
}
try
{
// Ensure that connection is alive
if ((TdsParserState.Broken == State) || (TdsParserState.Closed == State))
{
throw ADP.ClosedConnectionError();
}
// This validation step MUST be done after locking the connection to guarantee we don't
// accidentally execute after the transaction has completed on a different thread.
if (firstCall)
{
_asyncWrite = !sync;
stateObj.SetTimeoutSeconds(timeout);
stateObj.SniContext = SniContext.Snix_Execute;
WriteRPCBatchHeaders(stateObj);
stateObj._outputMessageType = TdsEnums.MT_RPC;
}
for (int ii = startRpc; ii < rpcArray.Length; ii++)
{
rpcext = rpcArray[ii];
if (startParam == 0 || ii > startRpc)
{
if (rpcext.ProcID != 0)
{
// Perf optimization for Shiloh and later,
Debug.Assert(rpcext.ProcID < 255, "rpcExec:ProcID can't be larger than 255");
WriteShort(0xffff, stateObj);
WriteShort((short)(rpcext.ProcID), stateObj);
}
else
{
Debug.Assert(!ADP.IsEmpty(rpcext.rpcName), "must have an RPC name");
tempLen = rpcext.rpcName.Length;
WriteShort(tempLen, stateObj);
WriteString(rpcext.rpcName, tempLen, 0, stateObj);
}
// Options
WriteShort((short)rpcext.options, stateObj);
}
// Stream out parameters
SqlParameter[] parameters = rpcext.parameters;
for (int i = (ii == startRpc) ? startParam : 0; i < parameters.Length; i++)
{
// Debug.WriteLine("i: " + i.ToString(CultureInfo.InvariantCulture));
// parameters can be unnamed
SqlParameter param = parameters[i];
// Since we are reusing the parameters array, we cannot rely on length to indicate no of parameters.
if (param == null)
break; // End of parameters for this execute
// Validate parameters are not variable length without size and with null value.
param.Validate(i, isCommandProc);
// type (parameter record stores the MetaType class which is a helper that encapsulates all the type information we need here)
MetaType mt = param.InternalMetaType;
if (mt.IsNewKatmaiType)
{
WriteSmiParameter(param, i, 0 != (rpcext.paramoptions[i] & TdsEnums.RPC_PARAM_DEFAULT), stateObj);
//.........这里部分代码省略.........
示例3: TdsExecuteTransactionManagerRequest
internal SqlDataReader TdsExecuteTransactionManagerRequest(
byte[] buffer,
TdsEnums.TransactionManagerRequestType request,
string transactionName,
TdsEnums.TransactionManagerIsolationLevel isoLevel,
int timeout,
SqlInternalTransaction transaction,
TdsParserStateObject stateObj
)
{
Debug.Assert(this == stateObj.Parser, "different parsers");
if (TdsParserState.Broken == State || TdsParserState.Closed == State)
{
return null;
}
// Promote, Commit and Rollback requests for
// delegated transactions often happen while there is an open result
// set, so we need to handle them by using a different MARS session,
// otherwise we'll write on the physical state objects while someone
// else is using it. When we don't have MARS enabled, we need to
// lock the physical state object to syncronize it's use at least
// until we increment the open results count. Once it's been
// incremented the delegated transaction requests will fail, so they
// won't stomp on anything.
Debug.Assert(!_connHandler.ThreadHasParserLockForClose || _connHandler._parserLock.ThreadMayHaveLock(), "Thread claims to have parser lock, but lock is not taken");
bool callerHasConnectionLock = _connHandler.ThreadHasParserLockForClose; // If the thread already claims to have the parser lock, then we will let the caller handle releasing it
if (!callerHasConnectionLock)
{
_connHandler._parserLock.Wait(canReleaseFromAnyThread: false);
_connHandler.ThreadHasParserLockForClose = true;
}
// Capture _asyncWrite (after taking lock) to restore it afterwards
bool hadAsyncWrites = _asyncWrite;
try
{
// Temprarily disable async writes
_asyncWrite = false;
stateObj._outputMessageType = TdsEnums.MT_TRANS; // set message type
stateObj.SetTimeoutSeconds(timeout);
stateObj.SniContext = SniContext.Snix_Execute;
const int marsHeaderSize = 18; // 4 + 2 + 8 + 4
const int totalHeaderLength = 22; // 4 + 4 + 2 + 8 + 4
Debug.Assert(stateObj._outBytesUsed == stateObj._outputHeaderLen, "Output bytes written before total header length");
// Write total header length
WriteInt(totalHeaderLength, stateObj);
// Write mars header length
WriteInt(marsHeaderSize, stateObj);
WriteMarsHeaderData(stateObj, _currentTransaction);
WriteShort((short)request, stateObj); // write TransactionManager Request type
bool returnReader = false;
switch (request)
{
case TdsEnums.TransactionManagerRequestType.Begin:
Debug.Assert(null != transaction, "Should have specified an internalTransaction when doing a BeginTransaction request!");
// Only assign the passed in transaction if it is not equal to the current transaction.
// And, if it is not equal, the current actually should be null. Anything else
// is a unexpected state. The concern here is mainly for the mixed use of
// T-SQL and API transactions.
// Expected states:
// 1) _pendingTransaction = null, _currentTransaction = null, non null transaction
// passed in on BeginTransaction API call.
// 2) _currentTransaction != null, _pendingTransaction = null, non null transaction
// passed in but equivalent to _currentTransaction.
// #1 will occur on standard BeginTransactionAPI call. #2 should only occur if
// t-sql transaction started followed by a call to SqlConnection.BeginTransaction.
// Any other state is unknown.
if (_currentTransaction != transaction)
{
Debug.Assert(_currentTransaction == null || true == _fResetConnection, "We should not have a current Tx at this point");
PendingTransaction = transaction;
}
stateObj.WriteByte((byte)isoLevel);
stateObj.WriteByte((byte)(transactionName.Length * 2)); // Write number of bytes (unicode string).
WriteString(transactionName, stateObj);
break;
case TdsEnums.TransactionManagerRequestType.Commit:
Debug.Assert(transactionName.Length == 0, "Should not have a transaction name on Commit");
stateObj.WriteByte((byte)0); // No xact name
stateObj.WriteByte(0); // No flags
Debug.Assert(isoLevel == TdsEnums.TransactionManagerIsolationLevel.Unspecified, "Should not have isolation level other than unspecified on Commit!");
// WriteByte((byte) 0, stateObj); // IsolationLevel
//.........这里部分代码省略.........
示例4: TdsExecuteRPC
internal Task TdsExecuteRPC(SqlCommand cmd, _SqlRPC[] rpcArray, int timeout, bool inSchema, SqlNotificationRequest notificationRequest, TdsParserStateObject stateObj, bool isCommandProc, bool sync = true,
TaskCompletionSource<object> completion = null, int startRpc = 0, int startParam = 0) {
bool firstCall = (completion == null);
bool releaseConnectionLock = false;
Debug.Assert(cmd != null, @"cmd cannot be null inside TdsExecuteRPC");
Debug.Assert(!firstCall || startRpc == 0, "startRpc is not 0 on first call");
Debug.Assert(!firstCall || startParam == 0, "startParam is not 0 on first call");
Debug.Assert(!firstCall || !_connHandler.ThreadHasParserLockForClose, "Thread should not already have connection lock");
Debug.Assert(firstCall || _connHandler._parserLock.ThreadMayHaveLock(), "Connection lock not taken after the first call");
try {
_SqlRPC rpcext = null;
int tempLen;
// SQLBUDT #20010853 - Promote, Commit and Rollback requests for
// delegated transactions often happen while there is an open result
// set, so we need to handle them by using a different MARS session,
// otherwise we'll write on the physical state objects while someone
// else is using it. When we don't have MARS enabled, we need to
// lock the physical state object to syncronize it's use at least
// until we increment the open results count. Once it's been
// incremented the delegated transaction requests will fail, so they
// won't stomp on anything.
if (firstCall) {
_connHandler._parserLock.Wait(canReleaseFromAnyThread:!sync);
releaseConnectionLock = true;
}
try {
// Ensure that connection is alive
if ((TdsParserState.Broken == State) || (TdsParserState.Closed == State)) {
throw ADP.ClosedConnectionError();
}
// This validation step MUST be done after locking the connection to guarantee we don't
// accidentally execute after the transaction has completed on a different thread.
if (firstCall) {
_asyncWrite = !sync;
_connHandler.CheckEnlistedTransactionBinding();
stateObj.SetTimeoutSeconds(timeout);
if ((!_fMARS) && (_physicalStateObj.HasOpenResult))
{
Bid.Trace("<sc.TdsParser.TdsExecuteRPC|ERR> Potential multi-threaded misuse of connection, non-MARs connection with an open result %d#\n", ObjectID);
}
stateObj.SniContext = SniContext.Snix_Execute;
if (_isYukon) {
WriteRPCBatchHeaders(stateObj, notificationRequest);
}
stateObj._outputMessageType = TdsEnums.MT_RPC;
}
for (int ii = startRpc; ii < rpcArray.Length; ii++) {
rpcext = rpcArray[ii];
if (startParam == 0 || ii > startRpc) {
if (rpcext.ProcID != 0 && _isShiloh) {
// Perf optimization for Shiloh and later,
Debug.Assert(rpcext.ProcID < 255, "rpcExec:ProcID can't be larger than 255");
WriteShort(0xffff, stateObj);
WriteShort((short)(rpcext.ProcID), stateObj);
}
else {
Debug.Assert(!ADP.IsEmpty(rpcext.rpcName), "must have an RPC name");
tempLen = rpcext.rpcName.Length;
WriteShort(tempLen, stateObj);
WriteString(rpcext.rpcName, tempLen, 0, stateObj);
}
// Options
WriteShort((short)rpcext.options, stateObj);
}
// Stream out parameters
SqlParameter[] parameters = rpcext.parameters;
for (int i = (ii == startRpc) ? startParam : 0; i < parameters.Length; i++) {
// Debug.WriteLine("i: " + i.ToString(CultureInfo.InvariantCulture));
// parameters can be unnamed
SqlParameter param = parameters[i];
// Since we are reusing the parameters array, we cannot rely on length to indicate no of parameters.
if (param == null)
break; // End of parameters for this execute
// Throw an exception if ForceColumnEncryption is set on a parameter and the ColumnEncryption is not enabled on SqlConnection or SqlCommand
if (param.ForceColumnEncryption &&
!(cmd.ColumnEncryptionSetting == SqlCommandColumnEncryptionSetting.Enabled ||
(cmd.ColumnEncryptionSetting == SqlCommandColumnEncryptionSetting.UseConnectionSetting && cmd.Connection.IsColumnEncryptionSettingEnabled))) {
throw SQL.ParamInvalidForceColumnEncryptionSetting(param.ParameterName, rpcext.GetCommandTextOrRpcName());
}
// Check if the applications wants to force column encryption to avoid sending sensitive data to server
if (param.ForceColumnEncryption && param.CipherMetadata == null
&& (param.Direction == ParameterDirection.Input || param.Direction == ParameterDirection.InputOutput)) {
// Application wants a parameter to be encrypted before sending it to server, however server doesnt think this parameter needs encryption.
//.........这里部分代码省略.........
示例5: TdsExecuteTransactionManagerRequest
internal SqlDataReader TdsExecuteTransactionManagerRequest(byte[] buffer, TdsEnums.TransactionManagerRequestType request, string transactionName, TdsEnums.TransactionManagerIsolationLevel isoLevel, int timeout, SqlInternalTransaction transaction, TdsParserStateObject stateObj, bool isDelegateControlRequest)
{
SqlDataReader reader2;
if ((TdsParserState.Broken == this.State) || (this.State == TdsParserState.Closed))
{
return null;
}
bool lockTaken = false;
lock (this._connHandler)
{
try
{
try
{
if (this._isYukon && !this.MARSOn)
{
Monitor.Enter(this._physicalStateObj, ref lockTaken);
}
if (!isDelegateControlRequest)
{
this._connHandler.CheckEnlistedTransactionBinding();
}
stateObj._outputMessageType = 14;
stateObj.SetTimeoutSeconds(timeout);
stateObj.SniContext = SniContext.Snix_Execute;
if (this._isYukon)
{
this.WriteMarsHeader(stateObj, this._currentTransaction);
}
this.WriteShort((short) request, stateObj);
bool flag = false;
switch (request)
{
case TdsEnums.TransactionManagerRequestType.GetDTCAddress:
this.WriteShort(0, stateObj);
flag = true;
goto Label_0193;
case TdsEnums.TransactionManagerRequestType.Propagate:
if (buffer == null)
{
break;
}
this.WriteShort(buffer.Length, stateObj);
this.WriteByteArray(buffer, buffer.Length, 0, stateObj);
goto Label_0193;
case TdsEnums.TransactionManagerRequestType.Begin:
if (this._currentTransaction != transaction)
{
this.PendingTransaction = transaction;
}
this.WriteByte((byte) isoLevel, stateObj);
this.WriteByte((byte) (transactionName.Length * 2), stateObj);
this.WriteString(transactionName, stateObj);
goto Label_0193;
case TdsEnums.TransactionManagerRequestType.Commit:
this.WriteByte(0, stateObj);
this.WriteByte(0, stateObj);
goto Label_0193;
case TdsEnums.TransactionManagerRequestType.Rollback:
this.WriteByte((byte) (transactionName.Length * 2), stateObj);
this.WriteString(transactionName, stateObj);
this.WriteByte(0, stateObj);
goto Label_0193;
case TdsEnums.TransactionManagerRequestType.Save:
this.WriteByte((byte) (transactionName.Length * 2), stateObj);
this.WriteString(transactionName, stateObj);
goto Label_0193;
default:
goto Label_0193;
}
this.WriteShort(0, stateObj);
Label_0193:
stateObj.WritePacket(1);
stateObj._pendingData = true;
SqlDataReader reader = null;
stateObj.SniContext = SniContext.Snix_Read;
if (flag)
{
reader = new SqlDataReader(null, CommandBehavior.Default);
reader.Bind(stateObj);
_SqlMetaDataSet metaData = reader.MetaData;
}
else
{
this.Run(RunBehavior.UntilDone, null, null, null, stateObj);
}
if ((request == TdsEnums.TransactionManagerRequestType.Begin) || (request == TdsEnums.TransactionManagerRequestType.Propagate))
{
if ((transaction != null) && (transaction.TransactionId == this._retainedTransactionId))
{
return reader;
}
this._retainedTransactionId = 0L;
}
//.........这里部分代码省略.........
示例6: TdsExecuteSQLBatch
internal void TdsExecuteSQLBatch(string text, int timeout, SqlNotificationRequest notificationRequest, TdsParserStateObject stateObj)
{
if ((TdsParserState.Broken != this.State) && (this.State != TdsParserState.Closed))
{
if (stateObj.BcpLock)
{
throw SQL.ConnectionLockedForBcpEvent();
}
bool lockTaken = false;
lock (this._connHandler)
{
try
{
if (this._isYukon && !this.MARSOn)
{
Monitor.Enter(this._physicalStateObj, ref lockTaken);
}
this._connHandler.CheckEnlistedTransactionBinding();
stateObj.SetTimeoutSeconds(timeout);
if (!this._fMARS && this._physicalStateObj.HasOpenResult)
{
Bid.Trace("<sc.TdsParser.TdsExecuteSQLBatch|ERR> Potential multi-threaded misuse of connection, non-MARs connection with an open result %d#\n", this.ObjectID);
}
stateObj.SniContext = SniContext.Snix_Execute;
if (this._isYukon)
{
this.WriteMarsHeader(stateObj, this.CurrentTransaction);
if (notificationRequest != null)
{
this.WriteQueryNotificationHeader(notificationRequest, stateObj);
}
}
stateObj._outputMessageType = 1;
this.WriteString(text, text.Length, 0, stateObj);
stateObj.ExecuteFlush();
stateObj.SniContext = SniContext.Snix_Read;
}
catch (Exception exception)
{
if (!ADP.IsCatchableExceptionType(exception))
{
throw;
}
this.FailureCleanup(stateObj, exception);
throw;
}
finally
{
if (lockTaken)
{
Monitor.Exit(this._physicalStateObj);
}
}
}
}
}
示例7: TdsExecuteRPC
internal void TdsExecuteRPC(_SqlRPC[] rpcArray, int timeout, bool inSchema, SqlNotificationRequest notificationRequest, TdsParserStateObject stateObj, bool isCommandProc)
{
if ((TdsParserState.Broken != this.State) && (this.State != TdsParserState.Closed))
{
_SqlRPC lrpc = null;
bool lockTaken = false;
lock (this._connHandler)
{
try
{
if (this._isYukon && !this.MARSOn)
{
Monitor.Enter(this._physicalStateObj, ref lockTaken);
}
this._connHandler.CheckEnlistedTransactionBinding();
stateObj.SetTimeoutSeconds(timeout);
if (!this._fMARS && this._physicalStateObj.HasOpenResult)
{
Bid.Trace("<sc.TdsParser.TdsExecuteRPC|ERR> Potential multi-threaded misuse of connection, non-MARs connection with an open result %d#\n", this.ObjectID);
}
stateObj.SniContext = SniContext.Snix_Execute;
if (this._isYukon)
{
this.WriteMarsHeader(stateObj, this.CurrentTransaction);
if (notificationRequest != null)
{
this.WriteQueryNotificationHeader(notificationRequest, stateObj);
}
}
stateObj._outputMessageType = 3;
for (int i = 0; i < rpcArray.Length; i++)
{
int length;
lrpc = rpcArray[i];
if ((lrpc.ProcID != 0) && this._isShiloh)
{
this.WriteShort(0xffff, stateObj);
this.WriteShort((short) lrpc.ProcID, stateObj);
}
else
{
length = lrpc.rpcName.Length;
this.WriteShort(length, stateObj);
this.WriteString(lrpc.rpcName, length, 0, stateObj);
}
this.WriteShort((short) lrpc.options, stateObj);
SqlParameter[] parameters = lrpc.parameters;
for (int j = 0; j < parameters.Length; j++)
{
SqlParameter param = parameters[j];
if (param == null)
{
break;
}
param.Validate(j, isCommandProc);
MetaType internalMetaType = param.InternalMetaType;
if (internalMetaType.IsNewKatmaiType)
{
this.WriteSmiParameter(param, j, 0 != (lrpc.paramoptions[j] & 2), stateObj);
}
else
{
bool flag2;
if (((!this._isShiloh && !internalMetaType.Is70Supported) || (!this._isYukon && !internalMetaType.Is80Supported)) || (!this._isKatmai && !internalMetaType.Is90Supported))
{
throw ADP.VersionDoesNotSupportDataType(internalMetaType.TypeName);
}
object coercedValue = null;
if (param.Direction == ParameterDirection.Output)
{
bool paramaterIsSqlType = param.ParamaterIsSqlType;
param.Value = null;
coercedValue = null;
param.ParamaterIsSqlType = paramaterIsSqlType;
}
else
{
coercedValue = param.GetCoercedValue();
}
bool isNull = ADP.IsNull(coercedValue, out flag2);
string parameterNameFixed = param.ParameterNameFixed;
this.WriteParameterName(parameterNameFixed, stateObj);
this.WriteByte(lrpc.paramoptions[j], stateObj);
this.WriteByte(internalMetaType.NullableType, stateObj);
if (internalMetaType.TDSType == 0x62)
{
this.WriteSqlVariantValue(flag2 ? MetaType.GetComValueFromSqlVariant(coercedValue) : coercedValue, param.GetActualSize(), param.Offset, stateObj);
}
else
{
int actualSize;
int num4 = internalMetaType.IsSizeInCharacters ? (param.GetParameterSize() * 2) : param.GetParameterSize();
if (internalMetaType.TDSType != 240)
{
actualSize = param.GetActualSize();
}
else
{
actualSize = 0;
}
//.........这里部分代码省略.........