use master
go
if DB_ID('UserImage') is not null
drop database UserImage
create database UserImage
go
use UserImage
go
create table Images
(
Image_Name nvarchar(255) primary key,
Image_Data Image not null
)
go
create proc InsertImage
(
@Image_Name nvarchar(255),
@Image_Data Image
)
as
insert into Images values(@Image_Name, @Image_Data)
go
create proc DeleteImage
(
@Image_Name nvarchar(255)
)
as
delete from Images where Image_Name = @Image_Name
go
create proc SelectImage
(
@Image_Name nvarchar(255)
)
as
select Image_Data from Images where Image_Name = @Image_Name
go
using System;
using System.Data;
using System.Data.SqlClient;
using System.Diagnostics;
using System.Drawing;
using System.Globalization;
using System.IO;
using System.ServiceProcess;
using System.Text.RegularExpressions;
using System.Windows.Forms;
namespace ImageSQL
{
public partial class FormImageSQL : Form
{
#region
private ServiceController server;
private SqlConnection sql;
private DataTable table;
private ChineseLunisolarCalendar lunarCalendar = new ChineseLunisolarCalendar();
#endregion
public FormImageSQL()
{
#region
InitializeComponent();
this.AllowDrop = true; // 启用拖放操作。
this.TransparencyKey = this.BackColor; // 窗体背景透明化。
pictureBoxIMG.BackColor = Color.Transparent; // 图像背景透明化。
pictureBoxIMG.SizeMode = PictureBoxSizeMode.Zoom; // 图像大小按其原有的大小比例被增加或减小。
openFileImage.Filter = "图像格式(*.BMP;*.GIF;*.JPG;*.PNG)|*.bmp;*.gif;*.jpg;*.png";
openFileImage.Multiselect = true; // 允许选择多个文件。
LoadData();
DataGridViewStyle();
toolComboBoxImage.AutoToolTip = true; // 显示工具提示。
toolComboBoxImage.ComboBox.DisplayMember = "Name";
toolComboBoxImage.ComboBox.DataSource = table.DefaultView;
toolComboBoxImage.DropDownStyle = ComboBoxStyle.DropDownList;
toolComboBoxImage.ComboBox.DrawMode = DrawMode.OwnerDrawFixed;
toolComboBoxImage.ComboBox.DrawItem += new DrawItemEventHandler(toolComboBoxImage_DrawItem);
#endregion
}
#region LoadData
private void LoadData()
{
server = new ServiceController("MSSQLSERVER"); // "MSSQL$SQLEXPRESS"
switch (server.Status)
{
case ServiceControllerStatus.Stopped: // 服务未运行。
server.Start(); // net start mssqlserver
break;
case ServiceControllerStatus.Paused: // 服务已暂停。
server.Continue(); // net continue mssqlserver
break;
}
Run:
{
System.Threading.Thread.Sleep(500);
server.Refresh(); // 通过将属性重置为其当前值来刷新属性值。
}
if (server.Status != ServiceControllerStatus.Running)
goto Run;
table = new DataTable();
DataColumn column = table.Columns.Add("Name", typeof(String));
table.Columns.Add("Image", typeof(Image));
table.Constraints.Add("PK", column, true);
SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder();
builder.DataSource = Environment.MachineName; // @"./SQLEXPRESS"
builder.InitialCatalog = "UserImage";
builder.IntegratedSecurity = true;
builder.TypeSystemVersion = "SQL Server 2000"; // "SQL Server 2005"
(sql = new SqlConnection(builder.ConnectionString)).Open();
using (SqlCommand cmd = new SqlCommand("Select * from Images", sql))
using (SqlDataReader sdr = cmd.ExecuteReader(CommandBehavior.CloseConnection))
{
int name = sdr.GetOrdinal("Image_Name");
int img = sdr.GetOrdinal("Image_Data");
table.BeginLoadData();
while (sdr.Read())
{
using (Stream ms = sdr.GetSqlBytes(img).Stream)
{
DataRow row = table.NewRow();
row.SetField<String>(0, sdr.GetString(name));
row.SetField<Image>(1, Image.FromStream(ms));
table.Rows.Add(row);
}
}
table.EndLoadData();
}
}
#endregion
#region ChineseLunisolarCalendar
private void timerDate_Tick(object sender, EventArgs e)
{
Application.CurrentCulture.ClearCachedData();
DateTime solar = DateTime.Now;
int month = lunarCalendar.GetMonth(solar);
int leapMonth = lunarCalendar.GetLeapMonth(lunarCalendar.GetYear(solar));
if (0 < leapMonth && leapMonth <= month)
--month;
statusLabelTime.Text = string.Format("{0:F} [{1} {2:00}]", solar, DateTimeFormatInfo.CurrentInfo.MonthNames[month - 1], lunarCalendar.GetDayOfMonth(solar));
}
#endregion
#region CopyImage
private void toolButtonCopy_Click(object sender, EventArgs e)
{
Clipboard.SetImage(pictureBoxIMG.Image);
}
#endregion
#region AddImage
private void toolButtonAdd_Click(object sender, EventArgs e)
{
if (openFileImage.ShowDialog(this) == DialogResult.OK)
ImageToMSSQL(openFileImage.FileNames);
}
protected override void OnDragEnter(DragEventArgs e)
{
base.OnDragEnter(e);
this.Activate();
DataObject data = e.Data as DataObject;
if (data.ContainsFileDropList())
ImageToMSSQL(data.GetFileDropList());
}
private void ImageToMSSQL(System.Collections.IEnumerable fileList)
{
foreach (string filePath in fileList)
{
if (!Regex.IsMatch(Path.GetExtension(filePath), @".(bmp|gif|jpg|png)", RegexOptions.IgnoreCase))
continue;
string imgName = Path.GetFileName(filePath);
if (table.Rows.Contains(imgName))
{
MessageBox.Show(this, string.Format("图像“{0}”已存在!", imgName), "确认图片添加", MessageBoxButtons.OK, MessageBoxIcon.Warning);
toolComboBoxImage.Text = imgName;
continue;
}
DataRow row = table.NewRow();
row.SetField<String>("Name", imgName);
row.SetField<Image>("Image", Image.FromFile(filePath));
table.Rows.Add(row);
using (SqlCommand cmd = new SqlCommand("InsertImage", sql))
{
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("@Image_Name", SqlDbType.NVarChar, imgName.Length).Value = imgName;
byte[] bytes = File.ReadAllBytes(filePath);
cmd.Parameters.Add("@Image_Data", SqlDbType.Image, bytes.Length).SqlValue = bytes;
if (sql.State == ConnectionState.Closed)
sql.Open();
cmd.ExecuteNonQuery();
if (sql.State == ConnectionState.Open)
sql.Close();
}
}
}
#endregion
#region DeleteImage
private void toolButtonDelete_Click(object sender, EventArgs e)
{
if (MessageBox.Show(this, string.Format("确实要删除“{0}”吗?", this.Text), "确认图片删除", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
using (SqlCommand cmd = new SqlCommand("DeleteImage", sql))
{
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("@Image_Name", SqlDbType.NVarChar, Text.Length).Value = this.Text;
if (sql.State == ConnectionState.Closed)
sql.Open();
cmd.ExecuteNonQuery();
if (sql.State == ConnectionState.Open)
sql.Close();
table.DefaultView.Delete(gridViewImage.CurrentCellAddress.Y);
toolButtonDelete.Enabled = (gridViewImage.CurrentCellAddress.Y > -1);
}
}
#endregion
#region DrawImage
private void toolComboBoxImage_DrawItem(object sender, DrawItemEventArgs e)
{
if (e.Index < 0)
return;
using (Graphics g = e.Graphics)
using (SolidBrush sb = new SolidBrush(e.BackColor))
{
if ((e.State & DrawItemState.Selected) != 0) // 取交集。
sb.Color = Color.BlueViolet;
Rectangle clip = e.Bounds;
g.FillRectangle(sb, clip);
clip.Offset(1, 1);
clip.Width = 36;
clip.Height -= 3;
g.DrawRectangle(Pens.Black, clip);
clip.Offset(1, 1);
clip.Width -= 1;
clip.Height -= 1;
DataRow row = table.Rows[e.Index];
g.DrawImage(row.Field<Image>("Image"), clip);
sb.Color = e.ForeColor;
g.DrawString(row.Field<String>("Name"), e.Font, sb, clip.X + 50, clip.Y);
}
}
#endregion
#region PaintImage
private void toolButtonPaint_Click(object sender, EventArgs e)
{
using (Process psi = new Process())
{
psi.StartInfo.FileName = "mspaint.exe"; // 启动画图。
psi.StartInfo.WorkingDirectory = Environment.SystemDirectory;
psi.StartInfo.WindowStyle = ProcessWindowStyle.Maximized;
psi.Start();
}
}
#endregion
#region RotateImage
private void toolButtonRotate_Click(object sender, EventArgs e)
{
RotateFlipType rft = sender.Equals(toolButtonLeft) ? RotateFlipType.Rotate90FlipXY : RotateFlipType.Rotate90FlipNone;
pictureBoxIMG.Image.RotateFlip(rft); // 旋转和翻转图像。
pictureBoxIMG.Refresh(); // 刷新图片。
gridViewImage.Refresh(); // 刷新图片。
toolComboBoxImage.ComboBox.Refresh(); // 刷新图片。
}
#endregion
#region SaveImage
private void toolButtonSave_Click(object sender, EventArgs e)
{
using (Bitmap bmp = new Bitmap(pictureBoxIMG.Image))
{
bmp.Save(Path.Combine(Application.StartupPath, this.Text));
}
Process.Start(Application.StartupPath);
System.Threading.Thread.Sleep(300);
SendKeys.SendWait(this.Text);
}
#endregion
#region DataGridViewStyle
private void DataGridViewStyle()
{
DataGridViewImageColumn imgColumn = new DataGridViewImageColumn();
imgColumn.DataPropertyName = "Image";
imgColumn.ImageLayout = DataGridViewImageCellLayout.Zoom; // 将图形按比例放大,直到达到其所在单元格的宽度或高度。
imgColumn.Width = 128; // 设置图片宽度。
gridViewImage.Columns.Add(imgColumn);
gridViewImage.RowTemplate.Height = 128; // 设置图片高度。
gridViewImage.BorderStyle = BorderStyle.Fixed3D;
gridViewImage.BackgroundColor = this.BackColor;
gridViewImage.AutoGenerateColumns = false; // 禁用自动创建列。
gridViewImage.AllowUserToAddRows = false; // 隐藏添加行。
gridViewImage.AllowUserToDeleteRows = false; // 禁用删除行。
gridViewImage.AllowUserToResizeRows = false; // 禁用调整行的大小。
gridViewImage.AllowUserToResizeColumns = false; // 禁用调整列的大小。
gridViewImage.ColumnHeadersVisible = false; // 隐藏列标题。
gridViewImage.RowHeadersVisible = false; // 隐藏行标题。
gridViewImage.ReadOnly = true; // 禁用编辑单元格。
gridViewImage.MultiSelect = false; // 用户仅能选择一个单元格、行或列。
gridViewImage.ShowCellToolTips = true; // 显示单元格工具提示。
gridViewImage.CellToolTipTextNeeded += new DataGridViewCellToolTipTextNeededEventHandler(gridViewImage_CellToolTipTextNeeded);
gridViewImage.SelectionChanged += new EventHandler(gridViewImage_SelectionChanged);
gridViewImage.DataSource = table.DefaultView;
}
private void gridViewImage_SelectionChanged(object sender, EventArgs e)
{
DataGridViewCell cell = gridViewImage.CurrentCell;
if (cell != null)
{
this.Text = cell.ToolTipText;
pictureBoxIMG.Image = cell.FormattedValue as Bitmap;
}
toolButtonDelete.Enabled = (cell != null);
toolButtonSave.Enabled = toolButtonCopy.Enabled = (pictureBoxIMG.Image != null);
}
private void gridViewImage_CellToolTipTextNeeded(object sender, DataGridViewCellToolTipTextNeededEventArgs e)
{
e.ToolTipText = table.DefaultView[e.RowIndex][0] as string;
}
private void pictureBoxIMG_MouseClick(object sender, MouseEventArgs e)
{
CurrencyManager manager = BindingContext[table.DefaultView] as CurrencyManager;
switch (e.Button)
{
case MouseButtons.Left:
--manager.Position;
break;
case MouseButtons.Right:
++manager.Position;
break;
}
}
#endregion
}
}