|
I will try that this code is not mine it was written by the author of the book murachs Sql Server 2012 for Developers. When i run the Debugger a message box pops up and says Error "Access is Denied". If i press the Okay button the program continues and loads the main form but the picture box is empty because the image columns are empty.
Now if i enter a productID into the textbox and press the upload button it will insert the productID into the productID column and generate a ImageID and RowID. The program is setup to look in the images folder, you type the image name for example "picture.jpg" into the textbox put in the productID number into the textbox and press the upload button.
static string imagesPath = "C:/Users/Gerry/Pictures/Images/";
modified 31-Dec-14 17:57pm.
|
|
|
|
|
Well, finding out exactly which line of code is causing the exception is the first step to solving the problem.
Could it be that the path you point out does not exist on your machine?
The difficult we do right away...
...the impossible takes slightly longer.
|
|
|
|
|
The path does exist for the fact that i created the folder and set the permissions to full control. Now i am starting to think it might be a database permissions issue even thou it does connect to the database under the SA user role for authentication. The connection string works just fine i have another program that will log in and retrieve data from the database and load it into a DataGrid. Below is the TSQL i used to create the Database and FILESTREAM and I made sure the FILESTREAM is turned on under the SQL Server Configuration Manager.
CREATE DATABASE medical
ON PRIMARY
(
NAME = medical,
FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\DATA\medical.mdf'),
FILEGROUP FileSteamImages CONTAINS FILESTREAM DEFAULT
(
NAME = medicalImages,
FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\DATA\medical_images');
GO
Here is the code i used to elevate the permissions:
EXEC sp_configure filestream_access_level, 2;
RECONFIGURE;
|
|
|
|
|
rattlerrFx wrote: Now i am starting to think it might be a database permissions issue
There's no use making a guess. Try doing what I said, and you'll find out exactly what's wrong.
The difficult we do right away...
...the impossible takes slightly longer.
|
|
|
|
|
No luck i commented out every try and catch block in the entire program still generates the same error. I think the error is being generated by the SQL Server.
|
|
|
|
|
I find that hard to believe since the function that's generating the messagebox is itself inside a catch block. Are you sure you commented out every try/catch block?
The difficult we do right away...
...the impossible takes slightly longer.
|
|
|
|
|
Now if i comment out just the Try and Catch in the following code the program does not produce the error but it also will not continue to load the program the debugger stops.
private void imageIDComboBox_SelectedIndexChanged(
object sender, EventArgs e)
{
int imageID = Convert.ToInt32(imageIDComboBox.Text);
Byte[] imageByteArray = ProductDB.ReadImage(imageID);
MemoryStream ms = new MemoryStream(imageByteArray);
imagePictureBox.Image = System.Drawing.Image.FromStream(ms);
ms.Close();
}
|
|
|
|
|
And when the program does not continue to load, what happens? Does it break with an unhandled exception?
The difficult we do right away...
...the impossible takes slightly longer.
|
|
|
|
|
It does not break or report any exceptions the debugger stops after about 6 secs.
|
|
|
|
|
SqlFileStream sourceStream = new SqlFileStream(path, context, FileAccess.Read);
System.ComponentModel.Win32Exception occurred
HResult=-2147467259
Message=Access is denied
Source=System.Data
ErrorCode=-2147467259
NativeErrorCode=5
StackTrace:
at System.Data.SqlTypes.SqlFileStream.OpenSqlFileStream(String path, Byte[] transactionContext, FileAccess access, FileOptions options, Int64 allocationSize)
at System.Data.SqlTypes.SqlFileStream..ctor(String path, Byte[] transactionContext, FileAccess access, FileOptions options, Int64 allocationSize)
at System.Data.SqlTypes.SqlFileStream..ctor(String path, Byte[] transactionContext, FileAccess access)
at MusicStoreImageManager.ProductDB.ReadImage(Int32 imageID) in c:\Users\Gerry\Downloads\sq12_allfiles\SQL Server 2012\Projects\C#\Chapter 20b\MusicStoreImageManager\ProductDB.cs:line 132
InnerException:
|
|
|
|
|
Turn on first chance exceptions and the debugger will break at the correct spot whether you have try/catch blocks or not. Then examine the *original* exception to get the real error message and line number.
|
|
|
|
|
That showed me the issue:
SqlFileStream sourceStream = new SqlFileStream(path, context, FileAccess.Read);
System.ComponentModel.Win32Exception occurred
HResult=-2147467259
Message=Access is denied
Source=System.Data
ErrorCode=-2147467259
NativeErrorCode=5
StackTrace:
at System.Data.SqlTypes.SqlFileStream.OpenSqlFileStream(String path, Byte[] transactionContext, FileAccess access, FileOptions options, Int64 allocationSize)
at System.Data.SqlTypes.SqlFileStream..ctor(String path, Byte[] transactionContext, FileAccess access, FileOptions options, Int64 allocationSize)
at System.Data.SqlTypes.SqlFileStream..ctor(String path, Byte[] transactionContext, FileAccess access)
at MusicStoreImageManager.ProductDB.ReadImage(Int32 imageID) in c:\Users\Gerry\Downloads\sq12_allfiles\SQL Server 2012\Projects\C#\Chapter 20b\MusicStoreImageManager\ProductDB.cs:line 132
InnerException:
|
|
|
|
|
OK, according to the docs, SqlFileStream requires integrated security. SQL server authentication is not supported.
|
|
|
|
|
Thank You for the Help it is greatly appreciated..
Modified the connection string a new error is produced:
imagePictureBox.Image = System.Drawing.Image.FromStream(ms);
System.ArgumentException occurred
HResult=-2147024809
Message=Parameter is not valid.
Source=System.Drawing
StackTrace:
at System.Drawing.Image.FromStream(Stream stream, Boolean useEmbeddedColorManagement, Boolean validateImageData)
at System.Drawing.Image.FromStream(Stream stream)
at MusicStoreImageManager.ImageManagerForm.imageIDComboBox_SelectedIndexChanged(Object sender, EventArgs e) in c:\Users\Gerry\Downloads\sq12_allfiles\SQL Server 2012\Projects\C#\Chapter 20b\MusicStoreImageManager\ImageManagerForm.cs:line 45
InnerException:
|
|
|
|
|
That's on the reading side, correct? Is the image correctly inserted into the database now?
|
|
|
|
|
No, it is located below the part i have in Bold and Italic is what produces the error. If i go to the debugger and select Continue it will continue to load the form and have an successful upload to the database.
private void imageIDComboBox_SelectedIndexChanged(
object sender, EventArgs e)
{
try
{
int imageID = Convert.ToInt32(imageIDComboBox.Text);
Byte[] imageByteArray = ProductDB.ReadImage(imageID);
MemoryStream ms = new MemoryStream(imageByteArray);
imagePictureBox.Image = System.Drawing.Image.FromStream(ms);
ms.Close();
}
catch (Exception ex)
{
MessageBox.Show(this, ex.Message, "Error");
}
}
System.ArgumentException occurred
HResult=-2147024809
Message=Parameter is not valid.
Source=System.Drawing
StackTrace:
at System.Drawing.Image.FromStream(Stream stream, Boolean useEmbeddedColorManagement, Boolean validateImageData)
at System.Drawing.Image.FromStream(Stream stream)
at MusicStoreImageManager.ImageManagerForm.imageIDComboBox_SelectedIndexChanged(Object sender, EventArgs e) in c:\Users\Gerry\Downloads\sq12_allfiles\SQL Server 2012\Projects\C#\Chapter 20b\MusicStoreImageManager\ImageManagerForm.cs:line 45
InnerException:
|
|
|
|
|
So you just need to turn off first chance exceptions. Some areas of .Net work based on exceptions (i.e. serialization) and they are handled by the framework. Remember, the first chance exceptions let you catch exceptions before the try / catch does. You shouldn't normally run with them on.
|
|
|
|
|
Thank you for the help i turned off the first chance exceptions.
|
|
|
|
|
Time for one last post before going out for New Year (it's only five-and-half-hours away here).
I find it interesting that if you define a Dictionary:
private Dictionary<int, Action<int>> IntKeyValueCode = new Dictionary<int, Action<int>>();
private void Method1(int someInt, string someString, double someDouble)
{
MessageBox.Show(string.Format("Method1: int: {0} string: {1} double: {2}", someInt, someString, someDouble));
}
private string someString = "a string";
private double someDouble = 199.994;
private void TestCodeInDictinary()
{
IntKeyValueCode.Add(1, value => Method1(value, someString, someDouble));
IntKeyValueCode[1](100);
} What is of interest to me is that this appears to "defy" what I believe to be the requirement that a Type declaration of Action<int> would allow only the assignment to it of a pointer to a method body with one-and-only one parameter ... of Type 'int.
Thoughts ?
«A man will be imprisoned in a room with a door that's unlocked and opens inwards ... as long as it does not occur to him to pull rather than push» Wittgenstein
modified 2-Jan-15 8:49am.
|
|
|
|
|
I do not see what the problem with this...
value => Method1(value, someString, someDouble)
This line does not say that the function you run inside the delegate can not get any value you want (number and type), it talking about the delegate itself, so you can not write this:
(val1, val2) => Method(val1, val2)
You may see the compiled code to understand more...
private void TestCodeInDictinary()
{
this.IntKeyValueCode.Add(1, delegate(int value)
{
this.Method1(value, this.someString, this.someDouble);
});
}
Skipper: We'll fix it.
Alex: Fix it? How you gonna fix this?
Skipper: Grit, spit and a whole lotta duct tape.
|
|
|
|
|
I believe it is the Action itself that is getting the parameter passed to it, 'value => ', not the method that you're calling inside the Action. Hell, you don't even need to use the parameters passed in
To illustrate:
private Dictionary<int, Action<int, int>> IntKeyValueCode = new Dictionary<int, Action<int, int>>();
private void TestCodeInDictinary()
{
IntKeyValueCode.Add(1, (value1, value2) => Method1(thisCodeDoesnt, giveAShit, whatsPassedIn));
IntKeyValueCode[1](100, 200);
}
|
|
|
|
|
Exactly!
Action<t> declares a delegate, where the left side of the lambda (=>) must fit the parameter list of that delegate (the <T> part) and the right side is what executed when the delegate called...
Skipper: We'll fix it.
Alex: Fix it? How you gonna fix this?
Skipper: Grit, spit and a whole lotta duct tape.
modified 31-Dec-14 12:31pm.
|
|
|
|
|
Hi,
any sample code i can fulfill the following?
creating internet explorer toolbar that extract all the elements from the active tab
So far, i can only find toolbar that just redirect / navigate to another page.
Please help.
|
|
|
|
|
You might want to define precisely what you mean by "extract all the elements".
|
|
|
|
|
Did you look at in system.net?
Following code extracts favicon from websites.
string u="web site address";
Uri url = new Uri(u);
String iconurl = "http://" + url.Host + "/favicon.ico";
WebRequest request = WebRequest.Create(iconurl);
try
{
WebResponse response = request.GetResponse();
Stream s = response.GetResponseStream();
return Image.FromStream(s);
}
...
Of one Essence is the human race
thus has Creation put the base
One Limb impacted is sufficient
For all Others to feel the Mace
(Saadi )
|
|
|
|