C#:计算数据类型长度规范

时间:2015-06-26 16:27:58

标签: c# .net

我将以下代码作为数据访问层的一部分。

    #region Update ConnectionType
    public void UpdateConnectionType(string lastUpdatedBy, string connectionTypeDesc, int connectionTypeID, bool isDisabled)
    {
        var sqlStatement = new StringBuilder();
        sqlStatement.Append(" UPDATE dbo.ConnectionType");
        sqlStatement.Append("   SET");
        sqlStatement.Append(" LastUpdatedBy = @LastUpdatedBy, ");
        sqlStatement.Append(" ConnectionTypeDesc = @ConnectionTypeDesc,");
        sqlStatement.Append(" IsDisabled = @IsDisabled, ");
        sqlStatement.Append(" LastUpdatedDate = GetDate() ");
        sqlStatement.Append(" WHERE ");
        sqlStatement.Append("   ConnectionTypeID = @ConnectionTypeID");

        SqlCommand sqlCommand = new SqlCommand(sqlStatement.ToString());

        sqlCommand.Parameters.Add("@ConnectionTypeID", SqlDbType.Int);
        sqlCommand.Parameters["@ConnectionTypeID"].Value = connectionTypeID;

        sqlCommand.Parameters.Add("@IsDisabled", SqlDbType.Bit);
        sqlCommand.Parameters["@IsDisabled"].Value = isDisabled;

        sqlCommand.Parameters.Add("@LastUpdatedBy", SqlDbType.VarChar);
        sqlCommand.Parameters["@LastUpdatedBy"].Value = lastUpdatedBy;

        sqlCommand.Parameters.Add("@ConnectionTypeDesc", SqlDbType.VarChar);
        sqlCommand.Parameters["@ConnectionTypeDesc"].Value = connectionTypeDesc;

        DBAccess.SQLServer.ExecuteNonQuery(DBAccess.SQLServer.GetConnectionString("AccountTracker"), sqlCommand);
    }
    #endregion

上面的代码指向一个数据库,其中ConnectionTypeDesc的数据类型为varchar(100).截至目前,我只表示它的类型为varchar。

我的问题是:我应该如何解释数据类型规范的差异?

  • 我应该使用下面的示例代码创建一个对象类吗?

        // SQL parameter collection
        var sqlParams = new List<SqlParameter>();
    
        sqlParams.Add(new SqlParameter() { ParameterName = "@Client_Code", SqlDbType = SqlDbType.VarChar, Size = 9, Value = clientCode });
    
        // Create sql command
        var sqlCmd = new SqlCommand(sqlStatement.ToString());
    
        // Add sql parameters to sql command
        sqlCmd.Parameters.AddRange(sqlParams.ToArray());
    
        // Execute sql
        DBAccess.SQLServer.ExecuteNonQuery(DBAccess.SQLServer.GetConnectionString("JutfDB"), sqlCmd);
    

1 个答案:

答案 0 :(得分:0)

如果您知道varchar字段的大小,那么在构建参数时总是指定该大小

sqlCommand.Parameters.Add("@ConnectionTypeDesc", SqlDbType.VarChar, 100);
sqlCommand.Parameters["@ConnectionTypeDesc"].Value = connectionTypeDesc;

这对查询的性能有重要影响,特别是如果您使用不同字符串长度的connectionTypeDesc的不同值重复它。

如果再次调用相同的查询,Sql Server中的查询优化器可以缓存您的查询计划并重新使用它,但前提是您已正确指定varchar列的大小

您可以在本文中阅读有关此问题的更多信息 How Data Access Code Affects Database Performance