-1
public class Customer : BaseClass<Customer>
{   
    public string Name { get; set; }
    public DateTime? DateOfBirth { get; set; }
    public string TelephoneNumber { get; set; }
    public string InsuranceProvider { get; set; }
    public int? PolicyNumber { get; set; }
    public byte [] Photo { get; set; }
}

此消息显示:

在此处输入图像描述

或这个:

在此处输入图像描述

如何修改此代码以能够持久化数据?

CustomerDAO.cs

class CustomerDAO
{
    .....
    public int Save(ITransactionManager tm, Customer item)
    {
        int count = -1;

        try
        {
            ISqlQueryExecutor<Customer> queryExecutor = new SqlQueryExecutor<Customer>(tm);

            count = 
                queryExecutor.
                ExecuteNonQuery(@"INSERT INTO Customer(
                                       ID
                                      ,Name
                                      ,TelephoneNumber
                                      ,DateOfBirth,
                                       InsuranceProvider,
                                       PolicyNumber)
                                  VALUES(
                                       @ID
                                      ,@Name
                                      ,@TelephoneNumber
                                      ,@DateOfBirth,
                                       @InsuranceProvider,
                                       @PolicyNumber)",
                                      item.ID,
                                      item.Name,
                                      item.TelephoneNumber,
                                      item.DateOfBirth,
                                      item.InsuranceProvider,
                                      item.PolicyNumber,item.Photo
                                      );
                                  //new DbParameter(item.ID, DbType.Int32),
                                  //new DbParameter(item.Name, DbType.String),
                                  //new DbParameter(item.TelephoneNumber, DbType.String),
                                  //new DbParameter(item.DateOfBirth, DbType.DateTime),
                                  //new DbParameter(item.InsuranceProvider, DbType.String),
                                  //new DbParameter(item.PolicyNumber, DbType.Int32)
                                  //new DbParameter(item.Photo, DbType.Binary)
                                  //);



            string str = string.Empty;
        }
        catch (Exception ex)
        {
            throw ex;
        }

        return count;
    }
    .... ....
}

客户BLL.cs

class CustomerBLL
{
... ... ...
    public int Save(Customer item)
    {
        int newId = 0;

        ITransactionManager tm = ApplicationContext.Get(DBNameConst.ActiveConnStringName);

        try
        {
            tm.BeginTransaction();

            item.ID = newId = PivotTable.GetNextID(tm, "Customer").Value;

            customerDao.Save(tm, item);

            PivotTable.UpdateNextIdField(tm, "Customer", newId);

            tm.CommitTransaction();
        }
        catch (Exception ex)
        {
            tm.RollbackTransaction();

            throw ex;
        }

        return newId;
    }
    ... ... ...
 }

ASqlQueryExecutor.cs

public abstract class ASqlQueryExecutor<T> : ISqlQueryExecutor<T>
{
 public virtual int ExecuteNonQuery(string queryString, params object[] parameters)
    {
        int count = -1;

        try
        {
            Command = ParameterAttacher.AttachSaveParameters(TransactionManager, queryString, parameters);
            Command.CommandText = queryString;
            count = Command.ExecuteNonQuery();
        }
        catch (Exception ex)
        {
            throw ex;
        }

        return count;
    }      

参数附件.cs

class ParameterAttacher
{
    public static IDbCommand AttachSaveParameters(ITransactionManager tm, string queryString, params object [] argumentsList)
    {
        IDbCommand command = new DbObjectInstantiator(tm.ProviderName).CreateCommand();
        command.Connection = tm.Connection;
        command.Transaction = tm.Transaction;

        IList<string> parameterNamesList = new List<string>(ParameterParser.Parse(queryString));

        if (parameterNamesList.Count > 0 && argumentsList.Length == argumentsList.Length)
        {
            int i = 0;

            foreach (string paramName in parameterNamesList)
            {
                Attach(command, paramName, argumentsList[i]);

                ++i;
            }
        }

        return command;
    }

    public static void Attach(IDbCommand command, string paramName, object dbParam)
    {
        IDbDataParameter param = command.CreateParameter();

        param.ParameterName = paramName;
        param.Value = (dbParam==null) ? ((object)DBNull.Value) : dbParam;
        //param.DbType = dbParam.DbType;

        command.Parameters.Add(param);
    }
}

在此处输入图像描述

4

1 回答 1

3

字符串或二进制数据将被截断。该语句已终止

这可能是因为您试图将太多数据存储到列中。例如,如果您在数据库中有一个 nvarchar(5) 列,并且您尝试在其中存储“这是一个字符串”,您可能会收到该错误,因为 5 个字符不能包含所有“这是一个字符串”。

您可以通过将 UI 中的字段限制为与数据库中的字段相同的长度来避免此问题。或者,您可以在验证方法中执行检查。

不允许从数据类型 nvarchar 到二进制的隐式转换。

这似乎相当明显:您正在尝试将字符值存储在二进制列中。你还没有提供你的数据库模式,所以我不能确定这可能在哪里;但是,如果您在数据库中设置了列或 sproc 参数,binary但您的 C# 详细说明了它,因为DbType.String您可能会收到此错误。

更新:

你从来没有设置你DbTypeParameterAttacher.Attach。这意味着Parameter将默认DbType.AnsiString为参数类型。如果您将它传递给它,byte[]可能会将其转换为 ansi 字符串,但是当将参数提供给 ADO 时,它会看到DbType.AnsiString并将其与varbinary(50)(or money, or datetime, orint等​​) 进行比较并抛出一个详细说明它的异常不知道如何转换为binary(例如隐式转换)。

另外,帮自己一个忙,摆脱:

catch(Exception ex)
{
  throw ex;
}

这只会迫使您放弃异常的真实位置,并导致您浪费时间试图找出真正的问题在哪里。

当你必须捕获时(例如当你想回滚事务时,只是throw,不要throw ex。只是throw不会丢失堆栈信息,你可以追踪异常的位置。例如:

    catch (Exception ex)
    {
        tm.RollbackTransaction();

        throw;
    }
于 2012-09-04T16:59:29.340 回答