将jpeg转换为byte [],然后插入SQL表

时间:2015-06-03 10:49:42

标签: c# sql-server database webforms type-conversion

我正在尝试将我从磁盘中选择的jpeg转换为字节数组,然后将其插入SQL Server中的表中。我没有收到任何错误,记录只是没有插入...

我正在使用一个允许您从下拉菜单中选择Scheme代码和版本的webform,然后从数据库中检索相应的数据并显示在webform上。您还可以创建新记录或更新现有记录。数据库中的一个字段是Logo,存储在varbinary(MAX)中。

这是onClick事件,其中从驱动器中选择的图像被复制到临时文件夹,然后从那里转换为字节数组。

        protected void btnSubmit_Click(object sender, EventArgs e)
        {
        //Div1.Visible = true;

        string fileName = Path.GetFileName(logoPrvw.Value);
        File.Copy(logoPrvw.Value, @"C:\TempImages\" + fileName, true);

        System.Drawing.Image img = System.Drawing.Image.FromFile(@"C:\TempImages\" + fileName);
        byte[] logoBytes;
        using (MemoryStream ms = new MemoryStream())
        {
            img.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
            logoBytes = ms.ToArray();
        }



            TemplateData data = new TemplateData(txtSchemeCode.Text, txtVersion.Text, txtComment.Text, txtTemplateId.Text, logoBytes);
            try
            {
                if (ddSchemeCode.SelectedIndex == 0 | ddVersion.SelectedIndex == 0)
                {
                    DataClass.AddToData(data);
                }

                if (ddVersion.SelectedIndex != 0)
                {
                    DataClass.UpdateData(data);
                }
            }
        catch
            {
                Console.WriteLine("An error occured and the database was not updated.");
            }

下面是包含SQL指令的代码......

            public static TemplateData AddToData(TemplateData data)
    {
        string sqlAddNew = "INSERT INTO dbo.LetterTemplateCustomisation (Comment, TemplateId, Version, SchemeCode, Logo) ";
        sqlAddNew       += "VALUES ('" + data.Comment + "', " + data.TemplateId + ", " + data.Version + ", '" + data.SchemeCode + "'," + data.Logo + ")";

        string connectionString = System.Configuration.ConfigurationManager.ConnectionStrings["LettersDatabase"].ConnectionString;
        SqlConnection connect = new SqlConnection(connectionString);

        SqlCommand command = new SqlCommand(sqlAddNew, connect);

        command.CommandType = CommandType.Text;

        connect.Open();

        SqlDataReader dr = command.ExecuteReader();

        TemplateData tempData = null;
        if (dr.HasRows)
        {
            dr.Read();
            tempData = new TemplateData(dr);
        }

        dr.Close();
        connect.Close();

        return tempData;
    }

最后,大多数数据类

    public class TemplateData
    {
    public byte[] Logo { get; set; }
    public string TemplateId { get; set; }
    public string SchemeCode { get; set; }
    public string Version { get; set; }
    public string Comment { get; set; }

    public TemplateData(string schemeCode, string version, string comment, string templateID, byte[] logo)
    {
        SchemeCode = schemeCode;
        Version = version;
        Comment = comment;
        TemplateId = templateID;
        Logo = logo;

    }

    public TemplateData(SqlDataReader dr)
    {
        initialiseData();
        if (dr.HasRows)
        {
                Version = dr["Version"].ToString();
                Logo = (byte[])dr["Logo"];                 
                TemplateId = dr["TemplateId"].ToString();
                Comment = dr["Comment"].ToString();
                SchemeCode = dr["SchemeCode"].ToString();
        }
    }

我没有收到任何错误,记录只是没有出现在数据库中。就像,没有一个。

任何建议都将不胜感激。

我提出了一个断点 TemplateData data = new TemplateData(txtSchemeCode.Text, txtVersion.Text, txtComment.Text, txtTemplateId.Text, logoBytes); 和logoBytes有字节,它们不会去任何地方。

2 个答案:

答案 0 :(得分:1)

请参考此示例,它显示如何使用参数化命令

进行插入

https://msdn.microsoft.com/en-us/library/4f5s1we0(v=vs.110).aspx

答案 1 :(得分:0)

尝试使用sql参数而不是连接:

string sqlAddNew = "INSERT INTO dbo.LetterTemplateCustomisation (Comment, TemplateId, Version, SchemeCode, Logo) ";
sqlAddNew       += "VALUES (@comment, @templateid, @version, @schemecode,@logo)";

然后使用适当的SQL数据类型将参数添加到命令对象:

    command.Parameters.Add(New SqlParameter("@comment", SqlDbType.NVarChar)).Value = data.comment
    command.Parameters.Add(New SqlParameter("@templateid", SqlDbType.Int)).Value = data.templateid
    ...
    command.Parameters.Add(New SqlParameter("@logo", SqlDbType.Binary)).Value = data.logo

这只是一个疯狂的猜测,但应该排除任何连接问题,并希望能够使实际问题可见。

相关问题