
我估计是你在每次结束后没有释放连接,并且你没有用多线程进行 *** 作,所以第一次能运行,但是第二次运行的时候第一次的连接还没有释放,这样资源会被独享,所以会有不能写入的错误
建议修改一下你的代码
这并不是VC的问题
using Systemusing System.Collections.Generic
using System.ComponentModel
using System.Data
using System.Drawing
using System.Linq
using System.Text
using System.Threading.Tasks
using System.Windows.Forms
using System.Data.SqlClient
using System.Net
namespace WindowsFormsApplication1
{
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent()
}
//获取本机IP,然后存储在strAddr中
public string getLocalIP()
{
string strHostName = Dns.GetHostName()//得到本机的主机名
IPHostEntry ipEntry = Dns.GetHostEntry(strHostName)//取得本机IP
string strAddr = ipEntry.AddressList[0].ToString()
return (strAddr)
}
private void button1_Click(object sender, EventArgs e)
{
string username
string password
string LocalIP
string DBIP1 = ""
LocalIP = getLocalIP()
string dataDir = AppDomain.CurrentDomain.BaseDirectory
if (dataDir.EndsWith(@"\bin\Debug\")
|| dataDir.EndsWith(@"\bin\Release\"))
{
dataDir = System.IO.Directory.GetParent(dataDir).Parent.Parent.FullName
AppDomain.CurrentDomain.SetData("DataDirectory", dataDir)
}
//定义用户名和密码变量
username = textBox1.Text
password = textBox2.Text
//使用创建数据库连接
using (SqlConnection conn = new SqlConnection(@"Data Source=数据库Initial Catalog=xxxUser ID=数据库用户名Password=密码"))
{
conn.Open()//打开数据库
//获取数据库中当前登录名的IP字段,存储与DBIP1中
using (SqlCommand getDBIP = conn.CreateCommand())
{
getDBIP.CommandText = "select * from LoginDetail where UID='" + username + "'"
using (SqlDataReader DBIP = getDBIP.ExecuteReader())
if (DBIP.Read())
{
DBIP1 = DBIP.GetString(DBIP.GetOrdinal("IPaddr"))
}
}
using (SqlCommand cmd = conn.CreateCommand())
{
//查询命令为:查询UserName等于输入的用户名
cmd.CommandText = "select * from LoginDetail where UID='" + username + "'"
//将查询到的数据保存在reader这个变量里
using (SqlDataReader reader = cmd.ExecuteReader())
{
//如果reader.Read()的结果不为空, 则说明输入的用户名存在
if (reader.Read())
{
/*从数据库里查询出和用户相对应的PassWorld的值
*reader.GetOrdinal("PassWord")的作用是得到PassWord的为这行数据中的第几列,返回回值是int
*reader.GetString()的作用是得到第几列的值,返回类型为String.
*/
string dbpassword = reader.GetString(reader.GetOrdinal("PWD"))
//比较用户输入的密码与从数据库中查询到的密码是否一至,如果一至,就登录成功
if (password == dbpassword)
{
if (DBIP1 == "")//如果数据库中当前登录的ID有记录IP地址,则拒绝登录
{
Form1 form1 = new Form1()
您好,希望以下回答能帮助您首先,添加一个Data数据控件,设置它的DatabaseName和RecordSource属性,
strPath = App.Path
If Right(strPath, 1) <>"\" Then
strPath = strPath &"\"
MyData.DatabaseName = strPath &"ExampleDB.mdb" '数据库存地址
MyData.RecordSource = "Info" '表名
第二步,添加Image控件用来显示图片,设置它的DataSource和DataField属性。例如本例中: Image1.DataSource="MyData"和Image1.DataField=" MyPhoto" 。然后设置其它具有数据绑定功能的控件用来显示所要的其它内容,经过这两步的 *** 作,运行程序就可以显示你要的数据了。
2、向数据库中添加需要存储的图片
首先,利用数据控件所具有的AddNew属性,添加一个按钮,双击后添加如下代码MyData.Recordset.AddNew
第二步,为Image控件图片指定图片路径Image1.Picture = LoadPicture("图片路径"),经过这两步的 *** 作,就可以向数据库中添加图片了。
这种方法最简单快捷,要写的代码量很少。但是这种方法在运行速度和灵活性方面有一定的限制,适合于初学者和一些简单的应用,要想灵活多变的显示图像,下面介绍的方法或许更适应您的要求。
利用编写代码实现图片的存储与显示
这种方法相对于方法一来说,代码量大,但是它 *** 作灵活,能够满足多样形式下的 *** 作,受到更多编程者的青睐。但是涉及到的知识面相对要多一些,不仅要掌握数据库的 *** 作方法,还要二进制文件的读写作进一步的了解。关于数据库及二进制文件的基本 *** 作很多参考书上都介绍的比较详细,需要时请查阅即可。在编程之前把本部分用到的变量说明如下:
Dim RS As New ADODB.Recordset
Dim Chunk() As Byte
Const ChunkSize As Integer = 2384
Dim DataFile As Integer, Chunks, Fragment As Integer
Dim MediaTemp As String
Dim lngOffset, lngTotalSize As Long
Dim i As Integer
1、从数据库中显示所需要的图片
第一步首先打开数据库,看有没有要查找的内容,有则继续执行,没有就退出
RS.Source = "select * from Info Where Name='" &sparaName &"'"
RS.ActiveConnection = "UID=PWD=DSN=TestDB"
RS.Open
If RS.EOF Then RS.cCose : Exit Sub
第二步,读出长二进制数据即图片数据,把它转换成图片文件, *** 作过程如下
MediaTemp = strPath &"picturetemp.tmp"
DataFile = 1
Open MediaTemp For Binary Access Write As DataFile
lngTotalSize = RS!MyPhoto.ActualSize
Chunks = lngTotalSize \ ChunkSize
Fragment = lngTotalSize Mod ChunkSize
ReDim Chunk(Fragment)
Chunk() = RS!MyPhoto.GetChunk(Fragment)
Put DataFile, , Chunk()
For i = 1 To Chunks
ReDim Chunk(ChunkSize)
Chunk() = RS!MyPhoto.GetChunk(ChunkSize)
Put DataFile, , Chunk()
Next i
Close DataFile
如您还有疑问可继续追问。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)