参数 5:无法从 'System.Drawing.Image' 转换为 'string' - 从主类调用 class1

Posted

技术标签:

【中文标题】参数 5:无法从 \'System.Drawing.Image\' 转换为 \'string\' - 从主类调用 class1【英文标题】:Argument 5: cannot convert from 'System.Drawing.Image' to 'string' - calling class1 from Main Class参数 5:无法从 'System.Drawing.Image' 转换为 'string' - 从主类调用 class1 【发布时间】:2013-04-28 19:49:40 【问题描述】:

我正在处理我以前的线程here。我收到这个错误。我不知道如何解决这个问题。我正在尝试在 Main 类中调用 class1.cs。如果有人可以在这里帮助我,将不胜感激。提前谢谢...

这是class1.cs

public static OleDbConnection GetConnection()

    var myCon = new OleDbConnection();
    myCon.ConnectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data  
    Source=C:\...Database1.mdb";
    return myCon;


public static void Insert(string id, string agegroup, string gender, string photoa)


    var con = GetConnection();
    OleDbCommand cmd = new OleDbCommand();
    cmd.CommandType = CommandType.Text;
    cmd.CommandText = "INSERT INTO Table1 (ID, AgeGroup, Gender, photo )";
    cmd.Parameters.AddWithValue("@ID", id);
    cmd.Parameters.AddWithValue("@AgeGroup", agegroup);
    cmd.Parameters.AddWithValue("@Gender", gender);
    cmd.Parameters.AddWithValue("@photo", photoa);

    cmd.Connection = con;
    con.Open();
    cmd.ExecuteNonQuery();
    con.Close();

这是我想调用它的主类。

 private void btnInsert_Click(object sender, EventArgs e)
    

        Class1.Insert(textBox1.Text, comboBox1.Text, comboBox2.Text, pictureBox1.Image); // error is pointing at picture1.Image
        if (pictureBox1.Image != null)
        
            //using MemoryStream:
            ms = new MemoryStream();
            pictureBox1.Image.Save(ms, ImageFormat.Jpeg);
            byte[] photo_aray = new byte[ms.Length];
            ms.Position = 0;
            ms.Read(photo_aray, 0, photo_aray.Length);
            cmd.Parameters.AddWithValue("@photo", photo_aray);
        

【问题讨论】:

【参考方案1】:

问题是您发送图像但您的方法接受字符串类型

public static void Insert(string id, string agegroup, string gender, System.Drawing.Image photoa)

   // code 
    cmd.Parameters.AddWithValue("@photo", imageToByteArray(photoa));
   // code 


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

【讨论】:

感谢您的快速响应。我在这里陷入困境。 Jon Skeet 已经接受了现实检查并就插入功能提出了建议。然后我应该问一下错误... 非静态字段、方法或属性 'WFATest1.Class1.imageToByteArray(System.Drawing.Image) 需要对象引用 @bucketblast - 为了从您的 Insert 方法调用 imageToByteArray,它必须是静态的。【参考方案2】:

是的 - 你的最后一个参数是这样声明的:

string photoa

...但是您使用picture1.Image 的参数调用它,这不是字符串。您要在数据库中存储什么文本?或者,如果您尝试存储图像数据本身,为什么要声明string 类型的参数?

我们可以告诉您出了什么问题,但您需要自己确定要如何解决它,因为我们不知道您的要求。您可能想要将图像写入流,并将二进制数据存储在数据库中。或者您可能只是想在数据库中存储一个文件名。

顺便说一句,鉴于这个问题和您的最后一个问题,我强烈建议您退后一步,从基础开始学习 C#,而不是深入研究 GUI 和数据库。如果您对一开始的语言有非常牢固的掌握,以后处理更复杂的事情会容易得多。我建议您从使用框架的核心元素(集合、文件 IO 等)的基于控制台的应用程序开始。尝试语言的各个方面(以及一般的面向对象),例如继承、重载等。然后当您对这些构建块,您将处于更好的位置,可以在更具挑战性的情况下工作。不幸的是,有些书从数据库和用户界面开始将初学者抛入了深渊:(

【讨论】:

我想存储图片。我想也许我需要使用字节而不是字符串,但这不起作用。我将在顶部编辑我的主题以向您展示我的意思 @bucketblast:当Insert 调用返回时,插入已经发生,cmd 超出范围。正如我所说,我强烈建议您退后一步 - 在没有真正了解发生了什么的情况下随意尝试对您没有帮助。 我明白你的意思。我可以在 Main 类中使用这些功能,我只想知道其他类是如何完成的。但感谢您的建议。我正在看java数据结构和算法的书,希望能帮到我 @bucketblast:这里的问题不是数据结构和算法,而是 C#。 @bucketblast:我的意思是,这两个问题基本上都表明您目前有点超出您的深度,并且会从回归基础中受益。

以上是关于参数 5:无法从 'System.Drawing.Image' 转换为 'string' - 从主类调用 class1的主要内容,如果未能解决你的问题,请参考以下文章

无法从 'System.Drawing.Bitmap' 转换为 'byte[*,*,*]'

从 VB 转换为 C#:bitmap.save() 参数错误

使用 System.Drawing.Font.FromHfont(IntPtr hfont) 从 SYSTEM_FONT Stock 对象创建 System.Drawing.Font

从 System.Drawing.Bitmap 加载 WPF BitmapImage

如何从 System.Drawing.Color 转换为 System.Windows.Media.Color?

.NET System.Drawing.Common 4.5.1 的 NuGet 包包含错误版本的程序集