我正试图在这里弄清楚一个概念,我有一个奇怪的问题。为了你的娱乐...
总结:
我想要做的是在C#代码中生成一个图像,将其插入到SQL 2012 db的varbinary(max)字段中,然后将其显示在SSRS报告中。 (是的,我记得在每次测试后删除rdl.data缓存。)图像只是一个带有突出显示的弧段的圆圈。这个db表基于http://www.kodyaz.com/articles/display-database-image-using-sql-server-2008-reporting-services.aspx中的那个。我唯一改变的是添加一个主键。我已经创建了一个DataSet(xsd)文件,并从服务器资源管理器中将表拖到它上面。
奇怪的部分是,虽然我正在成功插入记录并正确插入fname字段,但据我所知,二进制字段始终与添加的第一个字段重复。我还要提一下,当我最初通过写入本地磁盘文件测试主图形代码时,图像总是正确显示。
起初我认为从我拥有的Web服务中执行此操作可能会出现问题,但我在本地测试Web应用程序中运行代码的行为完全相同。此外,所有代码都是该方法的本地代码。没有任何远程持久性。不可否认,我只涉足图形。这是从各种其他参考文献中共同攻击的。这是代码的核心。我在try / catch中有它,并没有给出任何例外。
Bitmap x;
Pen p = new Pen(System.Drawing.Color.Red, 5);
Pen p2 = new Pen(System.Drawing.Color.Pink, 5);
SolidBrush b;
RectangleF rf;
Graphics gr;
p = new Pen(System.Drawing.Color.Red, iThick);
p2 = new Pen(System.Drawing.Color.Pink, iThick);
x = new Bitmap(500, 500);
rf = new RectangleF(0, 0, x.Width, x.Height);
gr = Graphics.FromImage(x);
b = new SolidBrush(System.Drawing.Color.White);
gr.FillRectangle(b, rf);
rf = new RectangleF(p.Width, p.Width, x.Width - p.Width * 2, x.Height - p.Width * 2);
gr.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
gr.DrawEllipse(p2, rf);
gr.DrawArc(p, rf, fStartAngle, fSweepAngle);
byte[] bytes;
using (System.IO.MemoryStream sampleStream = new System.IO.MemoryStream())
{
x.Save(sampleStream, System.Drawing.Imaging.ImageFormat.Bmp);
bytes = sampleStream.ToArray();
dsCountryTableAdapters.DBFiles1TableAdapter ta = new dsCountryTableAdapters.DBFiles1TableAdapter();
ta.Insert(sImageName, bytes);
}
答案 0 :(得分:0)
无论最初的问题是什么,将insert方法从TableAdapter.Insert更改为SQLConnection / SQLCommand设置就可以解决它。 (数据表结构没有变化。)仍然好奇为什么TA没有工作。
using (SqlCommand cmd = new SqlCommand("INSERT INTO DBFiles(fname, [file]) VALUES (@fname, @file)", conn))
{
using (System.IO.MemoryStream sampleStream = new System.IO.MemoryStream())
{
x.Save(sampleStream, System.Drawing.Imaging.ImageFormat.Bmp);
bytes = sampleStream.ToArray();
}
cmd.Parameters.Add("@fname", SqlDbType.NVarChar, 1000).Value = sImageName;
cmd.Parameters.Add("@file", SqlDbType.VarBinary, -1).Value = bytes;
conn.Open();
cmd.ExecuteNonQuery();
conn.Close();
}