|
When you pass a parameter by reference, the type of the variable you pass in has to match the type of the parameter exactly. Otherwise, you could write:
public void GetTypeAndSetToOne(ref object Value)
{
Value = new Frood("Towel");
}
...
int MyInt = 0;
GetTypeAndSetToOne(ref MyInt);
To make your code work, you'll need to box the variable into a temporary object variable, pass the temporary variable to the method, and then un-box the temporary variable back into the real variable:
string MyString = "";
int MyInt = 0;
object temp = MyString;
GetTypeAndSetToOne(ref temp);
MyString = (string)temp;
temp = MyInt;
GetTypeAndSetToOne(ref temp);
MyInt = (int)temp;
It's messy code, and liable to break if your method changes. If you explain what you're really trying to achieve, we might be able to suggest a better approach.
"These people looked deep within my soul and assigned me a number based on the order in which I joined."
- Homer
|
|
|
|
|
Snap!
Those who fail to learn history are doomed to repeat it. --- George Santayana (December 16, 1863 – September 26, 1952)
Those who fail to clear history are doomed to explain it. --- OriginalGriff (February 24, 1959 – ∞)
|
|
|
|
|
What is it they say about "great minds"?
"These people looked deep within my soul and assigned me a number based on the order in which I joined."
- Homer
|
|
|
|
|
There is no "nice" way - ref parameters must be of the same exact type as the value being passed, and the value must be an assignable value, so casts aren;t allowed either. (This is to ensure type integrity: otherwise if you assigned a new instance of a class in the method, it could end up with a "bad" class
class A {}
class B : A {}
class C : A {}
...
B b = new B();
Change(ref b);
...
void Change(ref A a)
{
a = new C();
}
You can do it, but you have to work with the system, and faff about a bit:
public void Test()
{
string MyString = "";
int MyInt = 0;
object oS = MyString;
GetTypeAndSetToOne(ref oS);
MyString = (string) oS;
object oI = MyInt;
GetTypeAndSetToOne(ref oI);
MyInt = (int) oI;
}
Those who fail to learn history are doomed to repeat it. --- George Santayana (December 16, 1863 – September 26, 1952)
Those who fail to clear history are doomed to explain it. --- OriginalGriff (February 24, 1959 – ∞)
|
|
|
|
|
Perhaps you want to use overloading?
You'll never get very far if all you do is follow instructions.
|
|
|
|
|
Generic could make it look like it works, with some boxing as suggested earlier in this thread. It's not a very elegant solution though.
using System;
namespace ConsoleApplication5
{
class Program
{
static void GetTypeAndSetToOne<T>(ref T Value)
{
if (Value is int)
{
Value = (T)(object)1;
Console.WriteLine("int");
}
else if (Value is string)
{
Value = (T)(object)"1";
Console.WriteLine("string");
}
}
static void Main(string[] args)
{
string myString = "";
int myInt = 0;
GetTypeAndSetToOne(ref myString);
GetTypeAndSetToOne(ref myInt);
Console.WriteLine("MyString, type = {0}, value = {1}", myString.GetType(), myString);
Console.WriteLine("MyInt, type = {0}, value = {1}", myInt.GetType(), myInt);
Console.ReadLine();
}
}
} Since MyString and MyInt are both local, I changed the capitalization of the starting-letter to indicate that. Otherwise it'd be suggesting it's a property, or at least a public field.
Bastard Programmer from Hell
If you can't read my code, try converting it here[^]
|
|
|
|
|
In SQL Server 2005 Stored Procedure I have the following:
[CODE]
CREATE FUNCTION [dbo].[LISTSTAFF]()
RETURNS TABLE
AS
RETURN(select * from tblStaff);
[/CODE]
In C#2005 I assign staff style table for gridview an error, can you help me fix this ?
[CODE]
...
SqlCommand cmd = new SqlCommand("LISTSTAFF", cnn);
cmd.CommandType = CommandType.StoredProcedure;
gridview.DataSource = cmd.ExecuteReader();// waring error in here
...
[/CODE]
I want assign list database style table for gridview.DataSource =... how assign ?
|
|
|
|
|
What is the error message?
Those who fail to learn history are doomed to repeat it. --- George Santayana (December 16, 1863 – September 26, 1952)
Those who fail to clear history are doomed to explain it. --- OriginalGriff (February 24, 1959 – ∞)
|
|
|
|
|
error message when runtime: "The request for procedure 'LISTSTAFF' failed because 'LISTSTAFF' is a tables valued function object"
|
|
|
|
|
Yes - because it is a function, not a procedure.
And you don't call functions directly, you call them via a SELECT or from a SP.
You might find that using a DataAdapter rather than a DataReader works better as well.
Try this:
using (SqlConnection cnn = new SqlConnection(strConnect))
{
cnn.Open();
using (SqlCommand cmd = new SqlCommand("SELECT * FROM LISTSTAFF()", cnn))
{
using (SqlDataAdapter da = new SqlDataAdapter(cmd))
{
DataTable dt = new DataTable();
da.Fill(dt);
gridview.DataSource = dt;
}
}
}
Those who fail to learn history are doomed to repeat it. --- George Santayana (December 16, 1863 – September 26, 1952)
Those who fail to clear history are doomed to explain it. --- OriginalGriff (February 24, 1959 – ∞)
|
|
|
|
|
if I use the DataSet or DataTable through SQL queries and assign the result to gridview.DataSource my program running very good but I want to learn writing Stored Procedures, Stored procedure writing I heard the program will run faster. you did not understand my question
|
|
|
|
|
That's because you asked the wrong question!
What you have created is an SQL Function, not an SQL Stored Procedure, and the two are very different things.
Stored Procedures are designed to be used from inside or outside SQL, while Functions are meant to be internal - it's like the difference between a class and it's private methods.
So delete your function (or there will be problems as the name is in use) and create this as a Stored Procedure instead of a Function:
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE LISTSTAFF
AS
BEGIN
SET NOCOUNT ON;
SELECT * FROM tblStaff
END
GO And your original code will give no error.
It won't display anything, either, probably - since the Connection will need to be open while the gridview loads from the reader and that's bad practice. I'd use the DataAdapter way if you want a DataSource rather a DataReader.
Those who fail to learn history are doomed to repeat it. --- George Santayana (December 16, 1863 – September 26, 1952)
Those who fail to clear history are doomed to explain it. --- OriginalGriff (February 24, 1959 – ∞)
|
|
|
|
|
I think the procedure can not be used because the procedure does not return a value and assign that value into gridview.DataSource. If you say the procedure is used, you can post your templates or my examples of how you edit ?
|
|
|
|
|
Member 2458467 wrote: procedure does not return a value
Um.
How do I put this? That turns out not to be the case...
A stored procedure is a collection of SQL statements, and so acts just as if you had submitted the statements as your SQL Command. So if you use SELECT, it "returns" the selected rows in just the same was as if you had used the SELECT statement directly instead of executing the stored procedure. Except it accepts parameters better, in that it works with OUTPUT parameters which it can set to specific values are return to your code via the Parameters collection of the SqlCommand in your C# code.
Trust me on this: Stored Procedures are used to "simplify" complicated SQL commands all the time: and that means returning result sets!
Try it: you will see what I mean. (But use a DataAdapter instead of a DataReader: you need the whole information available in order to use a DataSource correctly).
Those who fail to learn history are doomed to repeat it. --- George Santayana (December 16, 1863 – September 26, 1952)
Those who fail to clear history are doomed to explain it. --- OriginalGriff (February 24, 1959 – ∞)
|
|
|
|
|
Thank you for help me, I did it.
|
|
|
|
|
You're welcome!
Those who fail to learn history are doomed to repeat it. --- George Santayana (December 16, 1863 – September 26, 1952)
Those who fail to clear history are doomed to explain it. --- OriginalGriff (February 24, 1959 – ∞)
|
|
|
|
|
I've never called a function from ADO.NET, at least not directly, so I've learned something today! You need to mod what I'm about to say next through my lack of knpowledge:
Anyway when looking into this this SO post[^] seemed relevant - you need to add a parameter for the return value.
I don't know why you are creating a function (CREATE FUNCTION [dbo].[LISTSTAFF]() ) rather than an stored proc, but you'd more than likely need to assign the output parameter required to the data source rather than the result of the execute statement? I actually don't know on this part because as I say I've never really used a function before.
The other thing to do is take a step back and look at what you are doing - using a function in this context is odd, you are selecting a whole table, so I'd assume an stored procedure would be better (or even possibly querying a view depending on your requirements).
|
|
|
|
|
Try executing a "SELECT * FROM [LISTSTAFF]".
Should simply not be wrapped in a function. Shouldn't even be wrapped in a sproc, unless there's a reason to (something that adds value for either you or the enduser).
Member 2458467 wrote: gridview.DataSource =... how assign ? Try the manual[^], you're not the first to try and load data in a list.
Bastard Programmer from Hell
If you can't read my code, try converting it here[^]
|
|
|
|
|
you've not ever written Store procedure.
|
|
|
|
|
follow you write stores procedues how to assign gridview.DataSource ?
|
|
|
|
|
1. Whenever you get an error and you are asking for help, post the error, since there are thousands of possible errors.
2. new SqlCommand("LISTSTAFF", cnn); - this is your problem. It is not a stored procedure. It is a function. You even posted, CREATE FUNCTION...
To select from function you do SELECT field1, field2 FROM dbo.LISTSTAFF()
There are only 10 types of people in the world, those who understand binary and those who don't.
|
|
|
|
|
you probably never use stored procedures with writing CREATE FUNCTION [DBO].[LISTSTAFF]()
|
|
|
|
|
You can create a function in a stored procedure, sure, but I don't know why you would want to. However, in this case creating a function in the Stored Procedure does not do anything unless you then call SELECT * FROM dbo.Function().
There are only 10 types of people in the world, those who understand binary and those who don't.
|
|
|
|
|
I do not write according to a DataSet or DataTable, this writing style I would use, I heard stores Procedures writing style program will run faster, secure, more... should I try writing style stores Procedures. follow you write Stores Procedures how to assign values to gridview.DataSource ? if you write that you have to answer any of my eye.
|
|
|
|
|
I don't understand what you are asking. However, stored procedures do ten to execute faster because they can already be compiled. But you don't want to create a stored procedure that creates a function. Either use a stored procedure or a function.
There are only 10 types of people in the world, those who understand binary and those who don't.
|
|
|
|