-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;
    }
    .... ....
}

CustomerBLL.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;
    }      

ParameterAttacher.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からバイナリへの暗黙的な変換は許可されていません。

これはかなり明白なようです。文字値をバイナリ列に格納しようとしています。あなたはデータベーススキーマを提供していないので、これがどこにあるのかはっきりとはわかりません。ただし、データベースにcolumnまたはsprocパラメータが設定されているbinaryが、C#で詳細が示されているDbType.String場合は、このエラーが発生する可能性があります。

アップデート:

DbTypeに設定することはありませんParameterAttacher.Attach。これは、パラメータタイプParameterがデフォルトでに設定されることを意味します。DbType.AnsiStringこれを渡すと、byte[]それansi文字列に変換される場合がありますが、パラメータがADOに指定されると、DbType.AnsiStringvarbinary(50)が表示され、それを(またはmoney、、、、、など)と比較して、datetimeそのint詳細を示す例外がスローされます。に変換する方法がわかりませんbinary(たとえば、暗黙の変換)。

また、あなた自身に賛成して、以下を取り除いてください:

catch(Exception ex)
{
  throw ex;
}

それはあなたに例外の実際の場所を失うことを強制し、あなたが本当の問題がどこにあるかを理解しようとして時間を無駄にする原因になります。

キャッチする必要がある場合(たとえば、トランザクションをロールバックする場合はthrow、しないでくださいthrow exthrowスタック情報が失われることはなく、例外の場所を追跡できます。例:

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

        throw;
    }
于 2012-09-04T16:59:29.340 に答える