|
Hi,
I don't know if this was more suited to the database message board or not but I think my question is more to do with my code rather than the database.
I have a basic table with a few columns. One of them is a Bit type and is effectively a flag. All I want to do is get the flag value for a given ID.
I've tried using an output parameter in a stored procedure but I don't know the best way of retrieving the flag value and converting it to a Boolean in code. I don't think a SqlDataReader is ideal because it's only one value I want to return.
ALTER PROCEDURE SP_UserValid
@ID INT,
@Valid BIT OUTPUT
AS
SET NOCOUNT ON;
SET @Valid = (SELECT [Valid] FROM tUsers WHERE ID = @ID)
Here's my code:
SqlConnection connection = new SqlConnection(_ConnectionString);
SqlCommand cmd = new SqlCommand();
cmd.Connection = connection;
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = "SP_UserValid";
cmd.Parameters.Add(new SqlParameter("@ID", userID));
cmd.Parameters.Add(new SqlParameter("@Valid", bValid));
cmd.Parameters["@Valid"].SqlDbType = SqlDbType.Bit;
cmd.Parameters["@Valid"].Direction = ParameterDirection.InputOutput;
connection.Open();
cmd.ExecuteNonQuery();
cmd.Connection.Close()
Thanks for looking
|
|
|
|
|
bool isValid = Convert.ToBoolean(cmd.Parameters["@Valid"].Value)
only two letters away from being an asset
|
|
|
|
|
You could also use:
bool isValid = Convert.ToBoolean(SqlCommand.ExecuteScalar());
I'd probably have used
select @Valid = [Valid] FROM tUsers WHERE ID=@ID
But what you have is fine.
Lastly, you may want to use ParameterDirection.Output for the @Valid parameter since there isn't a value being passed in...
|
|
|
|
|
Thanks to both you guys
I ended up making my SP simpler:
...
SELECT [Valid] FROM tUsers WHERE ID = @ID
...
I then used ExecuteScalar() and it works great!
One question though, what if the value returned from the DB is NULL ? I've set the column to disallow NULL values but I thought it should probably have something in the code too, just in case
Lastly, is there a best practice for this sort of thing in terms of performance?
|
|
|
|
|
If the column is a bit data type then it will always return 0/1 never a null.
If the col is an int (I do this) then put a default on the table def of 0 and you will never get null returned
Never underestimate the power of human stupidity
RAH
|
|
|
|
|
Hi Mycroft,
"If the column is a bit data type then it will always return 0/1 never a null" => This is a false statement. I tried using the following query and in all three executions the IsActive field is null.
DECLARE @tb TABLE(UID INT ,IsActive BIT)
INSERT INTO @tb (UID) SELECT 1
SELECT * FROM @tb
DECLARE @tb TABLE(UID INT ,IsActive BIT)
INSERT INTO #Temp (UID) SELECT 1
SELECT * FROM #Temp
DROP TABLE #Temp
DECLARE @tb TABLE(UID INT ,IsActive BIT)
INSERT INTO Temp (UID) SELECT 1
SELECT * FROM Temp
DROP TABLE Temp
please correct me if i am wrong.
Mouli.
|
|
|
|
|
Ah you are right, either I made a dramatic mistake or this may have changed at some time. There used to be a time when bool/bit could not be null.
Still stick a contraint on the table forcing it to 0, that'll fix the issue and will save you writing code in the BL to check for null.
Never underestimate the power of human stupidity
RAH
|
|
|
|
|
PROBLEM:
The problem I am having is, given the layout of the Microsoft template for developing a Windows App, I need to know what is the best way of implementing a method to make modifications to a control on my main form (Form1).
NECESSARY BACKGROUND:
A basic Windows program comes up with a Form1.cs and a Program.cs (I have renamed Program.cs to FileOrganizer.cs).
In FileOrganizer.cs there is a Main method.
Within this Main method is "Application.Run(new Form1());".
What I want to do (within another method of the FileOrganizer class) is to update a control programmatically.
The fact that Form1 is "run" the way it is (i.e., using "Application.Run"), makes it so there is no reference to an object. Because there is no way to reference the Form1 object I don't know of a way to modify one of the controls on Form1.
If I create a global reference to Form1 and then create a "new" instance of Form1 (within Main) I receive an error ("Error 4 An object reference is required for the non-static field, method, or property 'FileOrganizer.FileOrganizer.mainForm'").
My implementation is as follows:
namespace FileOrganizer
{
public class FileOrganizer
{
private Form1 mainForm;
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
mainForm = new Form1();
Application.Run(mainForm);
I understand that this error occurs because the Main method is static although I don't understand why.
One way of making this work is by doing the following:
public class FileOrganizer
{
private Form1 mainForm;
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
FileOrganizer fg = new FileOrganizer();
}
public FileOrganizer()
{
mainForm = new Form1();
mainForm.Visible = true;
But I am not sure if this is the proper way to do what I need to do (i.e., provide a way to modify a control on Form1 in another method of the FileOrganizer class).
So, given the static Main limitation, what is the proper way to implement the code so that controls on Form1 can be modified?
modified on Tuesday, December 23, 2008 4:36 PM
|
|
|
|
|
Mike Bluett wrote: update a control programmatically.
What do you mean? What are trying to accomplish? Typically you would create a method in the form class to call and manipulate the control from there.
only two letters away from being an asset
|
|
|
|
|
I have updated my original posting in order to try and make it more clear. Hope this helps.
|
|
|
|
|
As I said before, the typically you would expose a method on the form to update and manipulate the control.
This is an advanced topic that seems to be above your level of skill, I suggest you do more research and learn more about forms and controls before you continue.
only two letters away from being an asset
|
|
|
|
|
It should not be an advanced topic!!
This is something ANY programmer would want to do with almost ANY program.
Besides before posting here I have done extensive reading in all kinds of C# books and resources and cannot find an answer to my problem. Basically, I am trying to understand why Microsoft would create such a complicated approach to doing what should be incredibly simple.
What I want to do is simply use a GLOBAL reference to Form1 so that I can setup an object reference to Form1 so that it can be accessed from another method within the Program class (or in my case the FileOrganizer class).
I am forced to use the "Application.Run" method; otherwise, the application will quit after it finishes executing my code. The Microsoft template places the "Run" call within Main. Because Main must be static, it will not let me create a GLOBAL reference to "Form1". I can create an object reference to Form1 within Main; however, it is not GLOBAL and I cannot access it from another method in the FileOrganizer class.
I am sure that Microsoft, in their infinite wisdom, provided a mechanism to accomplish this in a simple fashion; however, it is not obvious to me.
I had previously written another program (which I started in SharpDevelop). In this program, all of the modifications to the main form are done through events.
However, in my current program, there are no events that get fired (i.e., mouse clicks). What I am doing is reading some data from a database trying to use that data to populate a TreeView (which resides on the main form).
If I could create a GLOBAL variable, this would be incredibly simple to implement. Because I can't this becomes a major complication. Why it has to be this complicated is beyond me; however, I am willing to spend the time to understand it.
If you know of some code I can reference in some book or some web reference that can help me to understand this I would be very grateful.
|
|
|
|
|
Mike Bluett wrote: I have done extensive reading in all kinds of C# books and resources
It is quite obvious your research has been lacking. It is also quite apparent you don't have sufficient understanding of Windows programming to tackle this task. It is relatively easy to do and you have been given the answers, pay attention.
Mike Bluett wrote: I am forced to use the "Application.Run" method
Correct, this is the way a Windows app is started. If you had the knowledge of this environment you would understand that. Form1 (or whatever you name it) is the application, not Program!
Mike Bluett wrote: Why it has to be this complicated is beyond me
Yes it is. Hire someone to do it for you.
Mike Bluett wrote: If you know of some code I can reference
Have your looked here[^]
Since its Christmas Eve here, maybe you can hope Santa will bring you a clue, or at least a fully functional app all wrapped up in a pretty bow for you. Otherwise, I would suggest you stop complaining and actually learn the subject.
only two letters away from being an asset
|
|
|
|
|
Since it is Christmas I would think you would be a little more civil than you have been!!!
My research maybe lacking and that is why I came to this forum to get me on the right track, but all I have been greeted with is ARROGANCE!!!
I think you should take a couple of long breaths and relax a little. It might help your composure.
Merry Xmas!!
|
|
|
|
|
Do not get it. Can you clarify the question again and tell us what you were trying to do in a sentence?
LuckyBoy
|
|
|
|
|
This sentence was copied from my previous post:
"What I want to do (within another method of the FileOrganizer class) is to update a control programmatically."
For example, I want to add some nodes to a TreeView control.
So, this is what I want to do; however, you will not be able to respond with an appropriate answer unless you read through my previous post entirely.
|
|
|
|
|
Mike Bluett wrote: For example, I want to add some nodes to a TreeView control.
If you want to do this, why donot you put the update control method in the mainform constructor? Maybe I misunderstood you question. However, this is not common to initialize the control in this way for windows form app.
LuckyBoy
|
|
|
|
|
Maybe I wasn't clear enough. This is not about initialization. This is about modifying controls after initialization.
Controls should be able to be modified anywhere within the program and at any time while the program is running.
|
|
|
|
|
Yes, however, you cannot update a control from a thread other than the main UI thread. A well documented fact of Windows UI work. There are plenty of examples, here and elsewhere, about adding nodes to a treeview, I suggest you do a little research.
only two letters away from being an asset
|
|
|
|
|
I found the answer on another forum.
All I needed to do was to make the GLOBAL definition static due to the fact that the the method it is called from is static. Very simple as I expected it might be.
Code as follows:
public class FileOrganizer<br />
{<br />
private static Form1 mainForm;<br />
<br />
<br />
[STAThread]<br />
static void Main()<br />
{<br />
Application.EnableVisualStyles();<br />
Application.SetCompatibleTextRenderingDefault(false);<br />
mainForm = new Form1();<br />
Application.Run(mainForm);<br />
}
It's amazing how much of a run-around I was given on this forum.
|
|
|
|
|
Please help in solving my problem
Problem: I have an application, which was developed in combination of managed and unmanaged code, no method or function is exposed to the external world from unmanaged code.
but I found that there are some public functions availabe in managed code(again which are not static). which will gives the information which i required.
now i need to hook those managed c# functions and re-route them to my own function and then route it original path.
i heard something about "Profiling API Enter/Leave", is it possible to workout with this, if possible how to do that?
I am an Automation TestEngineer, i dont have any in-depth knowledge in all these...
desperately in need, please help me
Thanks for kind replies
Surya.
|
|
|
|
|
venkatcontact wrote: desperately in need
... of a clearer explanation
only two letters away from being an asset
|
|
|
|
|
Hi,
VS2005 C# WinForms
I have an app.config file which has a number of configurations (as well as the appSettings sections) there are a number of other custom config sections in the file and references to web services.
Due to the remoteness of many of the client apps I would like to maintain all the configurations in the database.
The idea is to generate the xml file at runtime, save it and then use that throughout the app.
Ive seen how I can set the appSettings sections at runtime -
http://www.codeproject.com/KB/cs/runtimeconsoleconfigfile.aspx
but is it possible to set the entire config file at runtime - including all my custome object sections and web references?
Thanks,
Chas
|
|
|
|
|
|
Hi All,
I am able to install and run the windows service on Win XP. Howeer, I cannot install the .NET 2.0 Windows service on Win2008 server. I have the following modules being called by Windows Service: i. A webservice application hosted on the same server. ii. Using a .NET 3.5 class library DLL to send emails (System.Net).
Below is the Install Log error:
Installing assembly 'C:\SMSWindowsService\bin\DataOnline.SMSWindowsService.exe'.
Affected parameters are:
logtoconsole =
assemblypath = C:\SMSWindowsService\bin\DataOnline.SMSWindowsService.exe
logfile = C:\SMSWindowsService\bin\DataOnline.SMSWindowsService.InstallLog
Installing service DOL SMS Windows Service...
Creating EventLog source DOL SMS Windows Service in log Application...
Rolling back assembly 'C:\SMSWindowsService\bin\DataOnline.SMSWindowsService.exe'.
Affected parameters are:
logtoconsole =
assemblypath = C:\SMSWindowsService\bin\DataOnline.SMSWindowsService.exe
logfile = C:\SMSWindowsService\bin\DataOnline.SMSWindowsService.InstallLog
Restoring event log to previous state for source DOL SMS Windows Service.
An exception occurred during the Rollback phase of the System.Diagnostics.EventLogInstaller installer.
System.Security.SecurityException: The source was not found, but some or all event logs could not be searched. Inaccessible logs: Security.
An exception occurred during the Rollback phase of the installation. This exception will be ignored and the rollback will continue. However, the machine might not fully revert to its initial state after the rollback is complete.
|
|
|
|