我有一个数据库表,其中一列定义为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();
}
答案 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);
}
}