1

初めて SQL Compact 4.0 を使用しており、IMAGE 列にデータを挿入しようとしていますが、ほとんどのデータは約 50k バイトです。

私が得ている問題は、画像列が十分に大きいはずなのに、データが 8000 バイトに切り捨てられていることです。

SqlCeParameter を使用してデータを挿入しています。サイズは byte[] (43402) の長さと一致するように設定されており、SqlDbType は SqlDbType.Image です。

データベースでは、すべての行が 8000 バイトです (datalength 関数を使用)。

これは、データベース スキーマ自体にあると思われます。おそらく、IMAGE 列に設定されたデフォルトのサイズであり、うまくいけばオーバーライドできます。興味深いことに、パラメーターにはベース DbType.Binary があります (Microsoft によれば、これは 8000 バイトに制限されています)。

====

画像を追加できなかったので、うーん。さらに詳しい情報は次のとおりです。

コマンドをビルドするコードは次のとおりです。_params は、各パラメーター名とデータを含む単なる辞書です。

var cmd = connection.CreateCommand();
cmd.CommandText = _command;

foreach(var p in _params)
{
  var param = SqlHelper.CreateSqlCeParameter(p);
  cmd.Parameters.Add(param);
  if(param.SqlDbType == System.Data.SqlDbType.Image)
  {
     param.Size = (p.Value as byte[]).Length;
  }
}
cmd.ExecuteNonQuery();

このヘルパー クラスを使用してパラメーターを作成します。

public class SqlHelper
    {
        public static SqlDbType MapToSqlCeType(object data)
        {
            if(data.GetType() == typeof(string))
            {
                return SqlDbType.NVarChar; 
            }

            if(data.GetType() == typeof(byte[]))
            {
                return SqlDbType.Image;
            }

            return SqlDbType.NVarChar;
        }

        internal static SqlCeParameter CreateSqlCeParameter(KeyValuePair<string, object> data)
        {
            return new SqlCeParameter(data.Key, SqlHelper.MapToSqlCeType(data.Value))
            {
                Value = data.Value
            };
        }
    }

チェックに使用しているSQL: SELECT top 10 datalength([Data]) FROM [Datamodule]; 行く

結果: 列 1 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000

4

1 に答える 1

0

私はこれを理解しました.SqlCeParameterを作成する方法に問題がありました.

名前と値を使用してパラメーターを作成すると、SqlDbType が VarBinary (既定) に設定され、すべてのデータが IMAGE 型の列に挿入されます。

したがって、次のコードを使用すると問題なく動作します。

 var cmd = connection.CreateCommand();
                    cmd.CommandText = _command;

                    foreach (var p in _params)
                    {
                        cmd.Parameters.Add(new SqlCeParameter(p.Key, p.Value));
                    }

                    cmd.ExecuteNonQuery();

SqlDbType を明示的に Image に設定するのではなく、VarBinary がその役割を果たしているように見えます。以前、スクリプトを使用してデータベースをアップグレードし、VARBINARY がデータを 4000 バイトに切り捨てたため、データを変換/キャストしようとしました。

助けてくれてありがとう。

于 2015-08-10T08:34:57.070 に答える