08P01:Nullable DateTime消息中剩余的数据不足

时间:2016-05-25 07:57:43

标签: c# npgsql

我有一个数据库表,其中一列定义为timestamp without time zone。现在从我的c#应用程序,当我尝试使用NpgSql BeginBinaryImport在该列中插入空值时,它会给出错误消息,如下所述:

  

08P01:消息中剩余的数据不足

以下是我要执行的代码:

static void Main(string[] args)
{
    BulkInsert();
}

private static void BulkInsert()
{

    DataTable table = new DataTable();
    table.Columns.Add("firstname", typeof(String));
    table.Columns.Add("lastname", typeof(String));
    table.Columns.Add("logdatetime", typeof(DateTime));
    table.Columns.Add("status", typeof(int));
    table.Columns.Add("id", typeof(long));

    var dataRow = table.NewRow();
    dataRow["firstname"] = "MyFirstName";
    dataRow["lastname"] = "MyLastName";
    dataRow["logdatetime"] = DBNull.Value;
    dataRow["status"] = 1;
    dataRow["id"] = 10;
    table.Rows.Add(dataRow);

    var data = new DataAccess();

    using (var npgsqlConn = new NpgsqlConnection([ConnectionString]))
    {
        npgsqlConn.Open();
        var commandFormat = string.Format(CultureInfo.InvariantCulture, "COPY {0} {1} FROM STDIN BINARY", "logging.testtable", "(firstName,LastName,logdatetime,status,id)");
        using (var writer = npgsqlConn.BeginBinaryImport(commandFormat))
        {
            foreach (DataRow item in dataTable.Rows)
            {
                writer.StartRow();
                foreach (var item1 in item.ItemArray)
                {
                     writer.Write(item1);
                }

            }
        }

        npgsqlConn.Close();
}

2 个答案:

答案 0 :(得分:3)

问题是你要编写的DBNull.Value - Npgsql不支持以这种方式写入空值。要编写null,您需要使用WriteNull()方法。

我可以让Npgsql接受DBNull.Value,但仅限于Write()的重载,它也接受NpgsqlDbType(因为Npgsql必须写入数据类型,而DBNull.Value我们没有这是什么意思。)

编辑:已完成此操作,请参阅https://github.com/npgsql/npgsql/issues/1122

答案 1 :(得分:1)

我在表格中批量复制数据时遇到了同样的问题。为了解决这个问题,我创建了一个扩展方法,因此您不必对所有字段进行空检查

    <android.support.v7.widget.Toolbar
    android:id="@+id/toolbar"
    android:layout_width="match_parent"
    android:layout_height="?attr/actionBarSize"
    android:background="?attr/colorPrimary"
    app:popupTheme="@style/AppTheme.PopupOverlay">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal">

            <ImageButton
                android:layout_width="wrap_content"
                android:layout_height="match_parent"
                android:layout_marginLeft="100sp"
                android:adjustViewBounds="true"
                android:background="@null"
                android:cropToPadding="true"
                app:srcCompat="@android:drawable/ic_menu_sort_by_size" />

            <ImageButton
                android:layout_width="wrap_content"
                android:layout_height="match_parent"
                android:layout_marginLeft="15sp"
                android:adjustViewBounds="true"
                android:background="@null"
                android:cropToPadding="true"
                app:srcCompat="@android:drawable/btn_plus" />

            <ImageButton
                android:id="@+id/savebtn"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignParentTop="true"
                android:layout_marginBottom="15sp"
                android:layout_marginLeft="15sp"
                android:adjustViewBounds="true"
                android:background="@drawable/ic_down"
                android:cropToPadding="true"
                app:srcCompat="@android:drawable/ic_menu_save" />
        </LinearLayout>

        <EditText
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />
    </LinearLayout>
</android.support.v7.widget.Toolbar>

这可以通用

public static void WriteWithNullCheck(this NpgsqlBinaryImporter writer, string value)
        {
            if (string.IsNullOrEmpty(value))
            {
                writer.WriteNull();
            }
            else
            {
                writer.Write(value);
            }
        }