|
@PubId is an int, you need to CAST it first.
You also need to put apostrophes in the @sqlString to delimit various values (like varchars and datetimes)
You should put square brackets in the @sqlString around @Column in case you have column names with spaces or with the same name as SQL reserved words (e.g. [date])
Finally, if you really must use Dynamic SQL then please validate the data coming into your stored procedure to reduce the risk of a SQL Injection Attack[^]. For example:
IF NOT EXISTS(SELECT *
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME='MON_AppMsgPubStatistics'
AND SCHEMA_NAME = 'dbo'
AND COLUMN_NAME = @Column)
BEGIN
-- Column does not exist.
RETURN 0;
END
ColinMackay.net
Scottish Developers are looking for speakers for user group sessions over the next few months. Do you want to know more?
|
|
|
|
|
I'm a new user of VB.NET with .NET Framework 1.1. My tutorial textbook included an ADO.NET chapter, and it made the following statement: "Although the sample in this chapter uses a Microsoft Access database, you don't have to have Microsoft Access installed. Visual Studio and ADO.NET include the necessary support to understand the Access file format as well as other formats."
Based on this statement, I developed my application on a WinXP box and built it's database usage around a Microsoft Access file. But when I deploy to a Win2k box that does not have Microsoft Access, my application crashes at the first database hit. If I deploy to a system with Access, then all is fine, so I know that the app is finding the file in the place where I told the installer to put it, but it looks like a non-Access system doesn't know what to do with the file. My deployment does include MDAC 2.7.
So what am I missing here? I've been scouring this website and the MSDN site looking for help and example code, but nothing addresses my question.
Thanks,
Phil
|
|
|
|
|
I believe there is a separate install for the "Jet Engine" pieces needed for Access.
WinXp has them as part of the OS install, but Win2K might not. In the earlier versions of ADO, these were included in the MDAC install, but not in later versions.
Absolute faith corrupts as absolutely as absolute power
Eric Hoffer
All that is necessary for the triumph of evil is that good men do nothing.
Edmund Burke
|
|
|
|
|
I'm trying to execute a stored procedure (like i've done many times) in C# using ADO.Net. Everything works fine up until 2 of the parameter additions, then it all goes to hell. Here's the code.
<br />
SqlConnection conn = new SqlConnection(strSqlConn);<br />
SqlCommand cmd = new SqlCommand();<br />
int pub = Int32.Parse(_pubid);<br />
<br />
cmd.CommandType = CommandType.StoredProcedure;<br />
cmd.CommandText = "MON_UpdateAMPTransformDataAndQueue";<br />
<br />
cmd.Parameters.Add("@environment", SqlDbType.Char,8);<br />
cmd.Parameters["@environment"].Direction = ParameterDirection.Input;<br />
cmd.Parameters["@environment"].Value = _environment;<br />
<br />
cmd.Parameters.Add("@node", SqlDbType.VarChar,30);<br />
cmd.Parameters["@node"].Direction = ParameterDirection.Input;<br />
cmd.Parameters["@node"].Value = _node;<br />
<br />
cmd.Parameters.Add("@channel", SqlDbType.VarChar,30);<br />
cmd.Parameters["@channel"].Direction = ParameterDirection.Input;<br />
cmd.Parameters["@channel"].Value = _chnlname;<br />
<br />
cmd.Parameters.Add("@pubid", SqlDbType.Int);<br />
cmd.Parameters["@pubid"].Direction = ParameterDirection.Input;<br />
cmd.Parameters["@pubid"].Value = pub;<br />
<br />
cmd.Parameters.Add("@subchannel", SqlDbType.VarChar,50);<br />
cmd.Parameters["@subchannel"].Direction = ParameterDirection.Input;<br />
cmd.Parameters["@subchannel"].Value = _subchnl;<br />
<br />
cmd.Parameters.Add("@queue", SqlDbType.VarChar, 30);<br />
cmd.Parameters["@queue"].Direction = ParameterDirection.Input;<br />
cmd.Parameters["@queue"].Value = targetQueue;<br />
<br />
cmd.Parameters.Add("@transdata", SqlDbType.Text);<br />
cmd.Parameters["@transdata"].Direction = ParameterDirection.Input;<br />
cmd.Parameters["@transdata"].Value = transformed;<br />
<br />
cmd.Parameters.Add("@instance", SqlDbType.Char, 3);<br />
cmd.Parameters["@instance"].Direction = ParameterDirection.Input;<br />
cmd.Parameters["@instance"].Value = _instance;<br />
<br />
cmd.Connection = conn;<br />
conn.Open();<br />
cmd.ExecuteNonQuery(); <<<< Throws Exception::: Procedure 'MON_UpdateAMPTransformDataAndQueue' expects parameter '@queue', which was not supplied. >>><br />
conn.Close();<br />
<br />
I know what the problem is, I'm just not sure how to fix it. When the debugger gets to the point of setting the Value of the @queue parameter. The targetQueue variable holds a value, but it never sets the Parameters value to it. It just stays null.... Same thing happens with @transdata, the variable that i'm assigning it hold a value, but the ".Value =" statement isn't setting the value.
Anyone have an idea?
|
|
|
|
|
sonicsqwirl wrote: The targetQueue variable holds a value, but it never sets the Parameters value to it. It just stays null....
Is targetQueue == null? If it is, then you'll need to set the parameter value to System.Data.SqlTypes.SqlString.Null[^].
cmd.Parameters["@queue"].Value = (targetQueue == null ? SqlString.Null : targetQueue);
Jon Sagara
Look at him. He runs like a Welshman. Doesn't he run like a Welshman? Doesn't he? I think he runs like a Welshman.
Sagara.org | Blog | My Articles
|
|
|
|
|
I have a table where I store an enum value from C#. I would prefer to store the value as text so that my sprocs that use the value would be more readable and flexible, but am worried about data bloat and perf since there will be a few hundred thousand entries. Does SQL do some smart things storing the same few strings many times? Or should I suck it up and store the enum as a tinyint?
|
|
|
|
|
Brian Perrin wrote: Does SQL do some smart things storing the same few strings many times?
Nope.
Brian Perrin wrote: Or should I suck it up and store the enum as a tinyint?
Yes. And welcome to the 5th normal form (If I remember my Database lectures)
Actually, saying "Yes" is not necessarily the correct answer. While your enum table is likely to be small and will probably only take one SQL Server page* which means its access will be very efficient, you may find that in certain situations this can slow down your application. For example in reporting situations it is normally better to have a slightly denormalised data model. The real answer lies in how you intend to use the data. Having said all that, in general the more normalised your data the better.
* SQL Server stores data in pages of 8K each. Well, you get a little less than that and SQL Server takes the rest for its own uses. Each page is one of 8 in an extent (total 64K in an extent) and it in those chunks that SQL Server accesses data from the disk
ColinMackay.net
Scottish Developers are looking for speakers for user group sessions over the next few months. Do you want to know more?
|
|
|
|
|
hi,
i have a table softwareMeter(id [primarykey], pcID, softID, myDateTime). what is the query to get the last usage of the software per pc?
|
|
|
|
|
Hi
Just have a try with the below code
<br />
Create Table #softwareMeter(id Int primary key, pcID Int, softID Int, myDateTime DateTime)<br />
<br />
Insert Into #softwareMeter Values (1,100,501,'20060301 10:12')<br />
Insert Into #softwareMeter Values (2,102,509,'20060301 12:40')<br />
Insert Into #softwareMeter Values (3,100,503,'20060302 08:12')<br />
Insert Into #softwareMeter Values (4,102,508,'20060302 13:50')<br />
Insert Into #softwareMeter Values (5,103,508,'20060303 13:50')<br />
Insert Into #softwareMeter Values (6,104,509,'20060303 15:20')<br />
Insert Into #softwareMeter Values (7,105,503,'20060303 18:13')<br />
<br />
select top 10 with ties PCID,max(MyDateTime) from #softwareMeter <br />
Group by PCID<br />
Order By PCID
The top close is a must and the number after top should be set wisely.
|
|
|
|
|
hey thanks for the reply... and for giving me the sql command.. thanks alot.. i appreciate it!
|
|
|
|
|
Hi All,
Is the value NULL different from SQL NULL??If yes, in what way??
create proc test
(
@dtm datetime
) As
begin
if(@dtm=NULL)
print 'It is NULL'
else
print 'It is not NULL'
when I execute this SP with like the one shown below
test NULL
it displays me the output as 'It is not NULL'. y is it so?? what is actually happening?
Thanks
|
|
|
|
|
Not even NULL is NULL.
In SQL a value of NULL indicates the value is unknown. A value of NULL is different from an empty or zero value. No two null values are equal.
Comparisons between two null values, or between a NULL and any other value, return unknown because the value of each NULL is unknown.
Null values usually indicate data that is unknown, not applicable, or to be added at a later time.
I think the comparison you are trying to make is testing a NULL value against another NULL which is like saying is Unknown = Unknown which cannot be compared, its Unknown
When doing comparisons you have to state :-
IS NULL or IS NOT NULL in a WHERE clause. So I am not too sure if you could say if(@dtm IS NULL)
....
Don't know if this helps any.
|
|
|
|
|
Hi,
I think what you are doing is something like this.
CREATE PROCEDURE dbo.Test
(@dtm datetime)
As
if(@dtm IS NULL) <--- Compare NULL not =
print 'It is NULL'
else
print 'It is not NULL'
GO
To check against NULL if thats what you really wish to do try this.
EXECUTE test Null;
Which produces this.
It is NULL
If you are trying to stop invalid dates you will need to look at other options as doing something like this, will not detect NULL and not passing a value would simply generate an error...
EXECUTE test ''; <-- This is not NULL its a value.
Hope this rambling helps?
Cheers
Dave
|
|
|
|
|
I am trying to use Data Access block V2. I am trying to use stored procedures to manipulate with data. Please tell me the way to pass Input and Output parameters with Data Access Application block.
Thanks,
Sandy Sekhon
|
|
|
|
|
Hi,
I am new to .NET and trying to understand the concept of the DataSet, so if I am talking rubbish please excuse my ignorance.
I believe one usage for the DataSet cab be to transport changes using the GetChanges() method to data services, hence limiting the amount of data in this transfer via a new DataSet.
In my simple example I use the Northwind database from SQL server to populate a DataSet and stored procedures to perform the required update commands. If I use these they work fine.
DataSet changedDataSet = new DataSet(); // Transport DataSet
DataSet commonDataSet = new DataSet(); // Working DataSet
SqlDataAdapter commonDataAdapter = new SqlDataAdapter ( ) ;
commonDataAdapter.SelectCommand = GenerateSelectCommand ( Sqlconn ) ;
commonDataAdapter.InsertCommand = GenerateInsertCommand ( Sqlconn ) ;
commonDataAdapter.UpdateCommand = GenerateUpdateCommand ( Sqlconn ) ;
commonDataAdapter.DeleteCommand = GenerateDeleteCommand ( Sqlconn ) ;
commonDataAdapter.Fill(commonDataSet,"Region");
At this point the commonDataSet is filled will all the records I require from the Region database table using a stored procedure for the select. When reviewing the data I get the following, this also indicates the RowState. I realise that the DataSet is a cached data/schema and AcceptChanges would commit and the Data Adapter Update() would fire the stored procedure updates to the DB based on RowState.
1 My Record To Edit. Unchanged
2 Western Unchanged
3 Northern Unchanged
4 Southern Unchanged
5 NorthWest Unchanged
6 NorthWest Unchanged
Now I perform some simple operations on the records as follows.
// Add new record
DataRow aRecord = commonDataSet.Tables["Region"].Rows.Add(new object [] {999, "NorthWest"});
// Edit record 1
aRecord = commonDataSet.Tables["Region"].Rows[0];
aRecord.BeginEdit();
aRecord["RegionDescription"] = "Edit this.";
aRecord.EndEdit();
// Delete record 4
aRecord = commonDataSet.Tables["Region"].Rows[3];
aRecord.Delete();
This results in the following. I have simply dumped the text out if the record is deleted, as I cannot access fields.
1 Edit this. Modified
2 Western Unchanged
3 Northern Unchanged
Row Deleted
5 NorthWest Unchanged
6 NorthWest Unchanged
999 NorthWest Added
I now trap the changes into a new DataSet as follows. I could use the override methods to select what I want but here I take all.
changedDataSet = commonDataSet.GetChanges();
//changedDataSet = commonDataSet.GetChanges(DataRowState.Modified | //DataRowState.Added); - Could do this to overload.
Now I look at the changes (changedDataSet) as follows.
1 Edit this. Modified
999 NorthWest Added
Row Deleted
Now my question is if I transport this DataSet to a data service component, which is responsible for updating the records on the central DB, how do I handle the deleted record as I have no field information such as Primary key ID etc?
Any help would be appreciated.
|
|
|
|
|
Hi Dave,
Cant you retrieve all the Required information for the deleted row before deleting it buy adding a new command before deleting.
For updating the DB you can use the commonDataAdapter Update Command
//Like this
commonDataAdapter.Update(commonDataSet);
and the adapter will update the DB and apply the changes to the DataSet.
That can be of help for you.
Best Regards
Live forever or just live a happy life (You Decide !)
|
|
|
|
|
Hi,
I was thinking that also but what I am confused about is that a DataSet is detached and designed to do this, unlike the Data Reader.
User UI (DataSet)<----> Middle Service Component (DataSet) <----> DataBase
If Microsoft is providing the ability to capture updates to pass to other objects, specifically via a DataSet, it does not make any sense to me that we have to deal with deleted records using a different rule? I understand a DataSet could hold other stuff apart from SQL like XML, Array, and Direct Table etc.
So what we are suggesting here is that the updated DataSet captures all the edits and updates, which can be passed to another component, but we have to deal with deletions manually? Obviously that’s possible but considering
a DataSet can be a complete set of relational tables, e.g. Customer ->> Orders -->Order Lines etc. does this not seem a bit of a task?
I am sure its me being stupid and someone will says its standard functionality but I can't find it?
I will dig about for some articles on this me thinks....
Cheers
Dave
|
|
|
|
|
Hi,
I think I have worked this out now by using a DataView in cobination with a DataSet!
DataSet does indeed operate as expected but we can sync the DataSet up with a DataView and this details the information I wanted regarding ViewRowState, e.g capturing changes that have been made to the DataSet in terms of Deletes, Updates and Additions.
So the DataView provides the sync record information in terms of rowstate between the DataSet such as :-
Added,
CurrentRows,
Deleted,
ModifiedCurrent,
ModifiedOrigional,
OrigionalRows,
Unchanged.
We can also combine these flags so I can get Added, Deleted and ModifiedCurrent.
I have created a sample application that demonstrates and explains if you are interested.
Cheers
Dave
HAL 9000: I'm sorry Dave, I'm afraid I can't do that.
DAVE: What's the problem?
HAL 9000: I think you know what the problem is just as well as I do.
DAVE: What are you talking about, HAL?
HAL 9000: Dave, this conversation can serve no purpose anymore. Goodbye.
|
|
|
|
|
Hi,
I'm not sure how to go about this...
I need to compare ID numbers to achieve two different columns (Size and Category from the same field). If I use UNION I'll get a new row, I just want another column added to the existing columns. Can you have more than one SELECT statement to add more columns to your output? Or am I going about it wrong?
Thanks,
Ron
SELECT Products.ItemNumber, SizesAndCategories.SizeCatName AS Size FROM Products, SizesAndCategories WHERE Products.SizeID=SizesAndCategories.SizeCatID AND Products.ItemID=?
//Join Somehow?
SELECT SizesAndCategories.SizeCatName AS Category FROM Products, SizesAndCategories WHERE Products.CategoryID=SizesAndCategories.SizeCatID AND Products.ItemID=?
|
|
|
|
|
myNameIsRon wrote: Can you have more than one SELECT statement to add more columns to your output? Or am I going about it wrong?
Yes, but from your example I cannot see what you are trying to do.
If this does not work, could you provide some sample data and show how you'd like it all joined up.
SELECT Products.ItemNumber, SizesAndCategories.SizeCatName AS Size, Categories.Category
FROM Products
INNER JOIN SizeAndCategories ON Products.SizeID=SizesAndCategories.SizeCatID
INNER JOIN (SELECT SizesAndCategories.SizeCatName AS Category
FROM Products
INNER JOIN SizeAndCategories ON Products.CategoryID=SizesAndCategories.SizeCatID
WHERE Products.ItemId = @ItemId) AS Categories
WHERE Products.ItemId = @ItemId
By the way, you can probably tell I prefer the explicit use of the JOIN type (e.g. INNER JOIN) to make it very obvious on what conditions two tables are joined together. I happen to think it makes the code easier to understand.
ColinMackay.net
Scottish Developers are looking for speakers for user group sessions over the next few months. Do you want to know more?
-- modified at 3:04 Thursday 2nd March, 2006
|
|
|
|
|
Hi Colin,
Thanks for your help. Sorry about not been better at explaining myself (new to sql), also sorry for not using the right sql terms...
Note: I'm using MS Access DB, so I think I only have LEFT and RIGHT JOIN?
Here is what I want to do, maybe JOIN is not the way to go?
In my Table "Products" I have two fields "SizeID" and "CategoryID" that references the SizeCatID in my Table "SizesAndCategories". The SizeCatName could be either a Size Or Category name, so I need a condition each time I pull it.
So basically (in none sql terms):
SizesAndCategories.SizeCatName AS Size (if SizeID = SizeCatID)
SizesAndCategories.SizeCatName AS Category (if CategoryID = SizeCatID)
Maybe renaming the Tables would work (I've seen this a,b used before)?
SELECT a.SizeCatName AS Size, b.SizeCatName AS Category FROM Products, SizesAndCategories a, SizesAndCategories b WHERE Products.SizeID = a.SizeCatID, Products.CategoryID = b.SizeCatID
Thanks for your help!!
Ron
-- modified at 11:34 Friday 3rd March, 2006
|
|
|
|
|
Hi,
I want to create index in my SQL Server database using
ADO.NET. I have a query something like this:
CREATE INDEX <index name="">
ON ( <column name=""> )
The query is correct( i have checked it in SQL Query Analyzer). But i dont know how to execute it using ADO.Net. I have used ExecuteNonQuery of SqlCommand class. But that does not work.
Any suggestion/solution please...
|
|
|
|
|
wasife wrote: I have used ExecuteNonQuery of SqlCommand class. But that does not work.
Too vague. How does it "not work"?
Since you can run just about any SQL through a SqlCommand (including CREATE INDEX) there must be some explanation and saying "that does not work" gives us no idea of where to start helping you.
ColinMackay.net
Scottish Developers are looking for speakers for user group sessions over the next few months. Do you want to know more?
|
|
|
|
|
Colin Angus Mackay wrote: saying "that does not work" gives us no idea of where to start helping you
Please give more detail as to what is not working
Paul
|
|
|
|
|
Deat CPians,
I have a heavy duty database on SQL Server 2000.
Every now and then I monitor the transactions applied against the database using SQL Profiler in order to spot the queries and SPs that use alot of CPU resources.
Here are a few of many transactions that my question will be based on:
APPLICATION TEXTDATA DURATION STARTTIME READS WRITES CPU
---------------------------------------------------------------------------------------------------------------------------------------------
.Net SqlClient Data Provider 1229250 1/3/2006 10:53:53 am 2080346 366 60811
Internet Information Services 618203 1/3/2006 10:54:38 am 61550 1 4016
.Net SqlClient Data Provider exec lc_getLatestIpById @mem_id = 267980 483 1/3/2006 11:26:44 am 4594 0 484 As you can see the second column displays the actual querry.
I noticed the there are many requests that have no TEXTDATA at all like the two firsts ones. Not only I do not know what these transactiosn are, but they are very heavy, they cost alot!
What are these transactions? What triggers them?
Thanking you in advance.
theJazzyBrain
Excellence is not an act, but a habit! Aristotle
|
|
|
|
|