Send Null to SQL Stored Proc with XML Parameters

Hi

I have a web form where the user will enter some information in a textbox.
The user may leave the texbox blank

Problem lies is how do i check for null (empty string value) when i send the string to the stored procedure.... i want to convert these to nulls at add the null to my table
vb
 
Dim xmlProdDimWebString = ""
 
 
Dim ProductLabel As TextBox = MyForm.FindControl("ProductLabelTextBox")
Dim ProductWidth As TextBox = MyForm.FindControl("ProductWidthTextBox")
Dim ProductHeight As TextBox = MyForm.FindControl("ProductHeightTextBox")
Dim ProductDepth As TextBox = MyForm.FindControl("ProductDimDepthTextBox")
Dim ProductDiameter As TextBox = MyForm.FindControl("ProductDimDiameterTextBox")
 
 
xmlProdDimWebString = xmlProdDimWebString + "<Product><id>" & _
             "<Label>" & ProductLabel.Text & "</Label>" & _
             "<Width>" & ProductWidth.Text & "</Width>" & _
             "<Height>" & ProductHeight.Text & "</Height>" & _
             "<Depth>" & ProducDepth.Text & "</Depth>" & _
             "<Diameter>" & ProductDiameter.Text & "</Diameter>" & _
             "</id></Product>"
 
 
Dim ProductDimensionParameter As New Parameter()
ProductDimensionParameter.Name = "ProductDimensions"
ProductDimensionParameter.DefaultValue = xmlProdDimWebString
ProductDimensionParameter.Direction = Data.ParameterDirection.Input
ProductDimensionParameter.DbType = Data.DbType.Xml
SQLDS.InsertParameters.Add(ProductDimensionParameter)
SQLDS.Insert()
 
 
sql
 
@ProdDimensions XML
 
 
as
 
 
DECLARE @ProductId INT --testing
SET @ProductId = 1 --testing
 
 
INSERT INTO Inventory.Dimensions
(ProductId, Width, Height, Depth, Diameter, LabelName)
SELECT	@ProductId,
		ParamValues.ID.query('Width').value('.','FLOAT'),
		ParamValues.ID.query('Height').value('.','FLOAT'),
		ParamValues.ID.query('Depth').value('.','FLOAT'),
		ParamValues.ID.query('Diameter').value('.','FLOAT'),
		ParamValues.ID.query('Label').value('.','VARCHAR(30)')
		FROM @ProdDimensions.nodes('/Product/id') as ParamValues(ID)

Open in new window

miguel_jAsked:
Who is Participating?
I wear a lot of hats...

"The solutions and answers provided on Experts Exchange have been extremely helpful to me over the last few years. I wear a lot of hats - Developer, Database Administrator, Help Desk, etc., so I know a lot of things but not a lot about one thing. Experts Exchange gives me answers from people who do know a lot about one thing, in a easy to use platform." -Todd S.

Rahul Goel ITILSenior Consultant - DeloitteCommented:
Use like this
(ProductLabel.Text.ToString() == string.Empty ? DbNull.Value : ProductLabel.Text.ToString())
0
miguel_jAuthor Commented:
Thanks Rahu..

It still adds a 0 into the table field...

How do i check for a null on the stored procedure
0
Anthony PerkinsCommented:
If you do not include the Xml element, then the value will be NULL and it will be added as NULL to the table.
0
HTML5 and CSS3 Fundamentals

Build a website from the ground up by first learning the fundamentals of HTML5 and CSS3, the two popular programming languages used to present content online. HTML deals with fonts, colors, graphics, and hyperlinks, while CSS describes how HTML elements are to be displayed.

miguel_jAuthor Commented:
i removed the element from the xmlstring but it still adds a 0

is there a way to check from empty string or null at the storedproc

e.g

isNull(ParamValues.ID.query('Height').value('.','FLOAT'), Null)
0
Anthony PerkinsCommented:
>>i removed the element from the xmlstring but it still adds a 0<<
You are right.  As a workaround consider using OPENXML() which does not have that problem.
0
Anthony PerkinsCommented:
Alternatively you could try it this way and it will give you the Null you need (Height is not included):

DECLARE @ProdDimensions XML

SET @ProdDimensions =
    '<Product>
      <id>
          <Label>Label Description</Label>
          <Width>1234.56</Width>
          <Depth>3456.78</Depth>
          <Diameter>4567.89</Diameter>
      </id>
    </Product>'

SELECT      @ProdDimensions.value('(/Product/id/Width)[1]','FLOAT'),
      @ProdDimensions.value('(/Product/id/Height)[1]', 'FLOAT'),
      @ProdDimensions.value('(/Product/id/Depth)[1]', 'FLOAT'),
      @ProdDimensions.value('(/Product/id/Diameter)[1]', 'FLOAT'),
      @ProdDimensions.value('(/Product/id/Label)[1]', 'VARCHAR(30)')

0
Anthony PerkinsCommented:
Or if you still want to use the nodes method then this will produce the right results:

SELECT      ParamValues.ID.value('(Width)[1]', 'FLOAT'),
      ParamValues.ID.value('(Height)[1]', 'FLOAT'),
      ParamValues.ID.value('(Depth)[1]', 'FLOAT'),
      ParamValues.ID.value('(Diameter)[1]', 'FLOAT'),
      ParamValues.ID.value('(Label)[1]', 'VARCHAR(30)')
FROM      @ProdDimensions.nodes('/Product/id') as ParamValues(ID)
 
Totally unrelated, unless you have to, do not use float, instead use numeric.
0

Experts Exchange Solution brought to you by

Your issues matter to us.

Facing a tech roadblock? Get the help and guidance you need from experienced professionals who care. Ask your question anytime, anywhere, with no hassle.

Start your 7-day free trial
miguel_jAuthor Commented:
Thank You acperkins,
Ive worked with your input... Im only sending the parameters that I need and have adapted your sql method to parse my string.

ps. Ive also removed the use of float and accepted decimal or numeric
0
It's more than this solution.Get answers and train to solve all your tech problems - anytime, anywhere.Try it for free Edge Out The Competitionfor your dream job with proven skills and certifications.Get started today Stand Outas the employee with proven skills.Start learning today for free Move Your Career Forwardwith certification training in the latest technologies.Start your trial today
ASP.NET

From novice to tech pro — start learning today.