Hey Cor,
OK, I've copied the entire CM_Pic_Edit Sub to the bottom of this post. when
a user right-clicks on a picturebox (that has an image), the context menu
has a choice for editing the pic. I don't decide which program to use for
editing. when my app loads, I get all of the information regarding the
current users preferences from the registry.
So, this is the flow:
User right-clicks on picturebox and selects Edit
Create an SQL Statement related to whichever picturebox was the source
Open a connection to the DB
Use the SQLDataReader and a filestream to write the pic to disk
shell to whatever the users preferred editor for pics is
write the edited pic back to the DB
Delete the disk file
Using the OLEDBDataReader with a JetDB throws an exception if the pic isn't
actually in the DB (only in the picbox because the user didn't save/update
the DB yet)
Using the SQLDataReader with MSDE2K, in the same situation does not throw an
exception. It just writes an empty file to disk.
As I said, I'd like to understand why no exception is thrown with the SQL /
MSDE version, but is with the OLE / JetDB version. Once I understand why, it
should be relatively easy to fix. I already know I can check the size of the
disk file and if it's 0, I can throw my own exception. However, my
preference would be to handle this before I get to file creation.
Again, my guess is that it has something to do with the different ways the
JetDB and the SQL DB represent an empty field. DBNull is what causes the
exception to be thrown in the OLE / JetDB case. But I don't know what the
equivalent to a DBNull is in an SQL DB.
regarding the memorystream, I'm not sure a memorystream would work for
sending an image from the DB to an editor, having it edited, then getting it
back to the DB.
Here's the code:
Private Sub CM_Pic_Edit_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles CM_Pic_Edit.Click
Dim pb, pm, pbfile, sql As String
sql = ""
pm = ""
pbfile = ""
If CM_Pics.SourceControl Is BTS_Pic1 Then
pm = "Picture 1"
pb = "Pic1"
sql = "SELECT BTSDB." + pb + " FROM BTSDB Where
(BTSDB.BTSIndex='" +
CStr(BP_BTS_Pick.Splits(0).DisplayColumns("BTSInde x").DataColumn.Value) +
"')"
pbfile =
Environment.GetFolderPath(Environment.SpecialFolde r.Personal) + "\" + pb +
".jpg"
ElseIf CM_Pics.SourceControl Is BTS_Pic2 Then
pm = "Picture 2"
pb = "Pic2"
sql = "SELECT BTSDB." + pb + " FROM BTSDB Where
(BTSDB.BTSIndex='" +
CStr(BP_BTS_Pick.Splits(0).DisplayColumns("BTSInde x").DataColumn.Value) +
"')"
pbfile =
Environment.GetFolderPath(Environment.SpecialFolde r.Personal) + "\" + pb +
".jpg"
ElseIf CM_Pics.SourceControl Is BTS_Pic3 Then
pm = "Picture 3"
pb = "Pic3"
sql = "SELECT BTSDB." + pb + " FROM BTSDB Where
(BTSDB.BTSIndex='" +
CStr(BP_BTS_Pick.Splits(0).DisplayColumns("BTSInde x").DataColumn.Value) +
"')"
pbfile =
Environment.GetFolderPath(Environment.SpecialFolde r.Personal) + "\" + pb +
".jpg"
End If
If CM_Pics.SourceControl Is Sec_Pic1 Then
pm = "Picture 1"
pb = "Pic1"
sql = "SELECT SectorDB." + pb + " FROM SectorDB Where
(SectorDB.SECTORIndex='" +
CStr(SI_Sector_Pick.Splits(0).DisplayColumns("SECT ORIndex").DataColumn.Value)
+ "')"
pbfile =
Environment.GetFolderPath(Environment.SpecialFolde r.Personal) + "\" + pb +
".jpg"
ElseIf CM_Pics.SourceControl Is Sec_Pic2 Then
pm = "Picture 2"
pb = "Pic2"
sql = "SELECT SectorDB." + pb + " FROM SectorDB Where
(SectorDB.SECTORIndex='" +
CStr(SI_Sector_Pick.Splits(0).DisplayColumns("SECT ORIndex").DataColumn.Value)
+ "')"
pbfile =
Environment.GetFolderPath(Environment.SpecialFolde r.Personal) + "\" + pb +
".jpg"
ElseIf CM_Pics.SourceControl Is Sec_Pic3 Then
pm = "Picture 3"
pb = "Pic3"
sql = "SELECT SectorDB." + pb + " FROM SectorDB Where
(SectorDB.SECTORIndex='" +
CStr(SI_Sector_Pick.Splits(0).DisplayColumns("SECT ORIndex").DataColumn.Value)
+ "')"
pbfile =
Environment.GetFolderPath(Environment.SpecialFolde r.Personal) + "\" + pb +
".jpg"
End If
Dim conn As SqlClient.SqlConnection = New SqlClient.SqlConnection
conn.ConnectionString = XConn.ConnectionString
If conn.State <> ConnectionState.Open Then
conn.Open()
End If
Dim cmd As SqlClient.SqlCommand = New SqlClient.SqlCommand(sql,
conn)
Dim fs As FileStream
Dim bw As BinaryWriter
Dim bufferSize As Integer = 300000
Dim outbyte(300000 - 1) As Byte
Dim retval As Long
Dim startIndex As Long = 0
Try
Dim reader As SqlClient.SqlDataReader =
cmd.ExecuteReader(CommandBehavior.SequentialAccess )
reader.Read()
fs = New FileStream(pbfile, FileMode.OpenOrCreate,
FileAccess.Write)
bw = New BinaryWriter(fs)
startIndex = 0
retval = reader.GetBytes(0, 0, outbyte, 0, bufferSize)
bw.Write(outbyte)
bw.Flush()
bw.Close()
fs.Close()
reader.Close()
If conn.State = ConnectionState.Open Then
conn.Close()
conn.Dispose()
End If
Dim go_edit As String
go_edit = CM_Pic_EditC(1) + " " + """" + pbfile + """"
Shell(go_edit, AppWinStyle.NormalFocus, True)
fs = New FileStream(pbfile, FileMode.OpenOrCreate,
FileAccess.Read)
Dim rawData() As Byte = New Byte(CInt(fs.Length)) {}
fs.Read(rawData, 0, System.Convert.ToInt32(fs.Length))
fs.Close()
If CM_Pics.SourceControl Is BTS_Pic1 Then
_XBTS.DataTable.Rows.Find(BP_BTS_Pick.Splits(0).Di splayColumns("BTSIndex").DataColumn.Value).Item("P ic1")
= rawData
ElseIf CM_Pics.SourceControl Is BTS_Pic2 Then
_XBTS.DataTable.Rows.Find(BP_BTS_Pick.Splits(0).Di splayColumns("BTSIndex").DataColumn.Value).Item("P ic2")
= rawData
ElseIf CM_Pics.SourceControl Is BTS_Pic3 Then
_XBTS.DataTable.Rows.Find(BP_BTS_Pick.Splits(0).Di splayColumns("BTSIndex").DataColumn.Value).Item("P ic3")
= rawData
End If
If CM_Pics.SourceControl Is Sec_Pic1 Then
_XSector.DataTable.Rows.Find(SI_Sector_Pick.Splits (0).DisplayColumns("SectorIndex").DataColumn.Value ).Item("Pic1")
= rawData
ElseIf CM_Pics.SourceControl Is Sec_Pic2 Then
_XSector.DataTable.Rows.Find(SI_Sector_Pick.Splits (0).DisplayColumns("SectoIndex").DataColumn.Value) .Item("Pic2")
= rawData
ElseIf CM_Pics.SourceControl Is Sec_Pic3 Then
_XSector.DataTable.Rows.Find(SI_Sector_Pick.Splits (0).DisplayColumns("SectorIndex").DataColumn.Value ).Item("Pic3")
= rawData
End If
File.Delete(pbfile)
Catch ex As Exception
If SD_Tabs.Current = 4 Then
MessageBox.Show(BP_BTS_Pick.Splits(0).DisplayColum ns("BTSID").DataColumn.Value.ToString
+ " - " + pm + " has not been saved to the Database. Click Update/Save, then
try Opening the picture again.", "Picture Not in DB", MessageBoxButtons.OK,
MessageBoxIcon.Information)
Else
MessageBox.Show(SI_Sector_Pick.Splits(0).DisplayCo lumns("SectorID").DataColumn.Value.ToString
+ " - " + pm + " has not been saved to the Database. Click Update/Save, then
try Opening the picture again.", "Picture Not in DB", MessageBoxButtons.OK,
MessageBoxIcon.Information)
End If
End Try
End Sub
"Cor Ligthert" <no************@planet.nl> wrote in message
news:%2******************@TK2MSFTNGP14.phx.gbl...
Lee,
Your code snippet is to small to give all that information to use you are
telling now.
However what tackled me direct. Why are you writing something to a
temporaly disk file?
Are you sure you would not have a look at my sample where the Memory
Stream is used?
Cor