Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
这里怎么了?在我的代码中(将图像插入数据库-C#)_C#_Database_Winforms - Fatal编程技术网

这里怎么了?在我的代码中(将图像插入数据库-C#)

这里怎么了?在我的代码中(将图像插入数据库-C#),c#,database,winforms,C#,Database,Winforms,我正试图从C#winform在access数据库中插入一个图像。我正在使用以下代码: private void button1_Click(object sender, EventArgs e) { OleDbConnection con = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\db1.mdb"); OleDbCommand cmd = con.

我正试图从C#winform在access数据库中插入一个图像。我正在使用以下代码:

    private void button1_Click(object sender, EventArgs e)
    {
        OleDbConnection con = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\db1.mdb");
        OleDbCommand cmd = con.CreateCommand();
        cmd.CommandText = "INSERT INTO Table1 (Product, Manufacturer, Description, Price, Image) VALUES ('Column1', 'Column2', 'Column3', 'Column4', @img)";
        byte[] yourPhoto = imageToByteArray(pictureBox1.Image);
        cmd.Parameters.AddWithValue("@img", yourPhoto);
        con.Open();
        cmd.ExecuteNonQuery();
        con.Close();
    }

    public byte[] imageToByteArray(System.Drawing.Image iImage)
    {
        MemoryStream mMemoryStream = new MemoryStream();
        iImage.Save(mMemoryStream, System.Drawing.Imaging.ImageFormat.Png);
        return mMemoryStream.ToArray();
    }
当我运行代码时,它会显示一个错误:
INSERT INTO语句中的语法错误。

我的代码有什么问题?我可以使用相同的查询成功地将文本插入数据库字段。

尝试在sql查询中以@img的形式输入img:

cmd.CommandText = "INSERT INTO Table1 (Product, Manufacturer, Description, Price, Image) VALUES ('Column1', 'Column2', 'Column3', 'Column4', @img);";

编辑:同时以“结束sql查询'。我在上面的查询中添加了它。

我相信您忘记了在参数前添加@符号:

    cmd.CommandText = "INSERT INTO Table1 (Product, Manufacturer, Description, Price, Image) VALUES ('Column1', 'Column2', 'Column3', 'Column4', img)";
应该是

    cmd.CommandText = "INSERT INTO Table1 (Product, Manufacturer, Description, Price, Image) VALUES ('Column1', 'Column2', 'Column3', 'Column4', @img)";

您尝试设置参数“@img”的值,但您的查询只提到“img”,因此您需要将查询文本设置为:

cmd.CommandText = "INSERT INTO Table1 (Product, Manufacturer, Description, Price, Image) VALUES ('Column1', 'Column2', 'Column3', 'Column4', @img )";

Image
是一个保留字,因此我假设您应该在SQL查询中将该字放在引号或方括号中。

可能是某些输入数据格式不正确,导致SQL注入。所以我建议你试试这个。使用参数化查询。此外,还要尝试为您的列提供一些好的描述性名称。形象将是模棱两可的。因为它将被视为关键字

cmd.CommandText = "INSERT INTO Table1 (Product, Manufacturer, Description, Price, [Image]) VALUES (@column1, @column2, @column3, @column4, @img )";
cmd.Parameters.AddWithValue("@column1", yourval);
cmd.Parameters.AddWithValue("@column2", yourval);
cmd.Parameters.AddWithValue("@column3", yourval);
cmd.Parameters.AddWithValue("@column4", yourval);
cmd.Parameters.AddWithValue("@img", yourPhoto);

尝试此操作并将参数添加到其他列:

 private void button1_Click(object sender, EventArgs e)
    {
        OleDbConnection con = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\db1.mdb");
        OleDbCommand cmd = con.CreateCommand();
        cmd.CommandText = "INSERT INTO Table1 (Product, Manufacturer, Description, Price,[Image]) VALUES (@Product,@Manufacturer,@Description,@Price,@Image)";
        byte[] yourPhoto = imageToByteArray(pictureBox1.Image);
        cmd.Parameters.AddWithValue("@Product", "yourProductValue");
        cmd.Parameters.AddWithValue("@Manufacturer","yourManufacturerValue");
        cmd.Parameters.AddWithValue("@Description", "yourDescriptionValue");
        cmd.Parameters.AddWithValue("@Price","yourPriceValue");
        cmd.Parameters.AddWithValue("@Image", yourPhoto);
        con.Open();
        cmd.ExecuteNonQuery();
        con.Close();
    }

public byte[] imageToByteArray(System.Drawing.Image iImage)
{
    MemoryStream mMemoryStream = new MemoryStream();
    iImage.Save(mMemoryStream, System.Drawing.Imaging.ImageFormat.Png);
    return mMemoryStream.ToArray();
}

向您致意

在img中添加“@”后仍不起作用。您的列的数据类型是什么?您确定“Column4”是Price列的有效值吗?是的!我确信这是因为我将它设置为字符串,因为价格应该用它的单位来节省,比如:25 PKR或3 USD等。实际上,我使用的代码与您提到的相同,“@”是复制此站点代码时留下的。我编辑了它。是的,我所做的只是在代码中包含“@”符号。希望有帮助。
Image
仍然是喷气发动机的保留字。此处不适用?请删除CommandText:)右侧@ColumnX参数周围的引号