sql datetime overflow - sql-server-2005

net and I'm trying to insert a row into an entity, and I keep getting the following error:
SqlDateTime overflow. Must be between 1/1/1753 12:00:00 AM and 12/31/9999 11:59:59 PM.
Here's my code on C# side:
public static void DumpToLog(string s, string userID)
{
var ler = new LoggedExceptionRepository();
var lex = new LoggedException();
lex.loginID = userID;
lex.dateTime = DateTime.Now;
lex.text = s;
ler.Add(lex);
ler.Save();
}
I've tried running sql server profiler and the only thing it executes is teh following (which if I execute directly against the sql server, it works!!):
exec sp_executesql N'insert [dbo].[LoggedExceptions]([text], [loginID], [dateTime])
values (#0, #1, #2)
select [ID]
from [dbo].[LoggedExceptions]
where ##ROWCOUNT > 0 and [ID] = scope_identity()',N'#0 nvarchar(max) ,#1 varchar(50),#2 datetime',#0=N'payment failed, rv = 0',#1='riz',#2='2010-11-03 12:05:00:690'
any suggestions as to what I can do next?

does it work if you hardcode the date parameter value? there could be something else going on, or it could be a misleading message.

Is there another datetime column in LoggedExceptions that you're not setting? There are cases where a framework will use DateTime.MinValue to fill in unspecified columns. Try setting explicit values for all datetime columns in LoggedExceptions.

found the issue. I just didn't realize that I was creating new objects and assigning them to existing entities earlier in teh code. so when it was saving the datacontext, it was having a problem with those earlier entities.

Related

Select Specific Column from a Linked Server Table

I have the following C# code to select a column from a table that is on a linked server:
var query2 = $#"select [FileName] from [AMS_H2H].[H2H].[dbo].[FileReconciliation] where ProductCode = #productCode";
LayZConnection(); //make the db connection
var candidates = _dbConnection.Query<int>(query2, new { productCode = "ACHDH" });
When running it, I get the following error:
"Input string was not in a correct format."
If my query is instead the following, where I select all columns, it works:
var query2 = $#"select * from [AMS_H2H].[H2H].[dbo].[FileReconciliation]
What is the correct format to select just the FileName. Btw, the first query works fine from MSSMS.
You're specifying a type of int in Query<int>, which will cause Dapper to try and map the result of the query to an integer, however your query is returning a filename in select [FileName], which would suggest that it is a string.
Changing the type Query<string> should solve the issue.
More information on Dapper's Query method is available in Dapper's documentation

How to compare string data to time

I have data type in string and the time is like 06:00A, 09:00P, etc. I would like to query data from 6am to 12pm, how do I convert the string data to time format and query it in linq to sql?
Use DateTime.ParseExact or DateTime.TryParseExact to convert the string to a date. If you can't guarantee that the string version of your time is always going to be correct, stick to the TryParseExact version.
Once you have it converted to date, query as normal.
Example at: https://dotnetfiddle.net/MDnERt
Edited after response:
If you are using the code as written against EntityFramework then no, this will not work. (Please also note that there is a big difference between Linq To SQL and Entity Framework, but the same concepts apply, to some degree)
ORMs that support LINQ are actually converting your where clauses into an Expression which is then translated by the ORM into SQL. You will get a NotSupported exception, or something similar.
Is there some reason why the table in question is using that time format? Why would you not just use a datetime in the table? There is also the option of using the time datatype in sql server (assuming you are targetting sql server) which is mapped to the TimeSpan type in .net.
You would define your table in Sql server like:
create table log ( data varchar(20), logtime time )
and the LINQ expression would look something like:
from x in Logs
where x.Logtime >= new TimeSpan(6,0,0) && x.Logtime <= new TimeSpan(12,0,0)
select x
Now we are getting into actual design questions, though, which is off topic. :)
I'd suggest writing own parser and represent times as TimeSpan:
TimeSpan? ToTimeSpan(string str)
{
// get A or P at the end
var amPm = str.Last();
int hrs, mins;
try
{
hrs = int.Parse(str.Substring(0, 2));
mins = int.Parse(str.Substring(3, 2));
}
catch
{
return null;
}
switch (amPm)
{
case 'P': hrs += 12; break;
case 'A': break;
default: return null;
}
return new TimeSpan(hrs, mins, 0);
}

How to fix error "Conversion failed when converting datetime from character string" in SQL Query?

The error that I found at the log is the one below.
'Illuminate\Database\QueryException' with message 'SQLSTATE[22007]:
[Microsoft][ODBC Driver 11 for SQL Server][SQL Server]Conversion
failed when converting date and/or time from character string. (SQL:
SELECT COUNT(*) AS aggregate
FROM [mytable]
WHERE [mytable].[deleted_at] IS NULL
AND [created_at] BETWEEN '2015-09-30T00:00:00' AND '2015-09-30T23:59:59'
AND ((SELECT COUNT(*) FROM [mytable_translation]
WHERE [mytable_translation].[item_id] = [mytable].[id]) >= 1)
)'
in
wwwroot\myproject\vendor\laravel\framework\src\Illuminate\Database\Connection.php:625
On the database, the DataType is datetime and is not null
Based on marc_s's answer I tried to change the format that I'm sending to the database. So I tried without the T on and [created_at] between '2015-09-30 00:00:00' and '2015-09-30 23:59:59'.
In my local, I'm using mysql, and the code works just fine. If I test the query above on the SQL Server client, both (with and without the T) works too.
How can I fix this problem without create any changes on the database itself?
The PHP/Laravel code:
$items = $items->whereBetween($key, ["'".$value_aux."T00:00:00'", "'".$value_aux."T23:59:59'"]);
With #lad2025 help, I got it to work.
Based on the point of his comments on my question, I changed in the code part (Laravel/PHP in this case) the format that I was passing. (In reality, I "removed" the format it self, and just added fields to a variable before passing to the query. This way, I let the database decide the format that he wants)
Instead of
$itens = $itens->whereBetween($key, ["'".$value_aux."T00:00:00'", "'".$value_aux."T23:59:59'"]);
I changed the code to this:
$sta = $value_aux."T00:00:00";
$end = $value_aux."T23:59:59";
$itens = $itens->whereBetween($key, [$sta, $end]);

Making an SQL prodedure to add characters to a string

Hi I'm trying to make a procedure in SQL that adds a bunch of zeroes to a string to complete its length to 18 characters for example:
0446793932' ====> '000000000446793932
and this procedure would go inside an update command,
UPDATE Table SET variable = prototype_procedure('0446793932') WHERE .......
I don't know much about SQL or procedures, if anyone could guide me through something that could help me understand, I would appreciate,
You can use REPLICATE function to achieve what you want.
http://msdn.microsoft.com/en-us/library/ms174383.aspx
DECLARE #t NVARCHAR(10) = N'0446793932'
SELECT #t, REPLICATE(N'0', 18 - LEN(#t)) + #t
depending on what language you are using along the SQL, your best bet is to just add the characters to the string before you send the data to database, that way you don't risk screwing up your tables.
I would using something like this in php for example:
$myvar = "123456";
$myvarLength = strlen($myvar);
if($myvarLength < 12){
while{$myvarLength != 12){
$myvar = "0".$myvar;
$myvarlength = strlen($myvar);
}
}
This should get the job done for you

Linq to sql - get value from db function and not directly from the db field (while mapping properties)

When you map a table to an object, every property created corresponds to one db column.
I want to execute a db function on a column before it gets mapped to the property, so the property gets the value returned by the db function, and not the column
I was trying to achieve that by Expression property of ColumnAttribute (as in the example below), so instead of BirthDate the usrFn_UTCToLocalTime(BirthDate) is returned
but it does not seem to be working and still gets pure value of the column.
[global::System.Data.Linq.Mapping.ColumnAttribute(Storage = "_BirthDate", DbType = "DateTime", UpdateCheck = UpdateCheck.Never, Expression = "dbo.usrFn_UTCToLocalTime(BirthDate)")]
public System.Nullable<System.DateTime> BirthDate
{
get
{
return this._BirthDate;
}
}
I have also modified the DBML XML as in:
other post on stackoverflow
but also without result.
Is that possible by using LINQ or do I have to overwrite a getter which costs roundtrip to the server?
According to the Remarks section on this MSDN page, the Expression property of the ColumnAttribute is used when calling CreateDatabase, so it won't work the way you intend unless you created your database with Linq to Sql.
You can create a Linq query that selects the various columns and calls the db function in one statement like this (based on MSDN example):
var qry = from person in db.Persons
select new {
FirstName = person.FirstName,
LastName = person.LastName,
BirthDate = person.BirthDate,
Dob = db.usrFn_UTCToLocalTime(person.BirthDate)
};
This projects into an anonymous type, but you could use a non-anonymous type as well. For the sake of the example, I've got a table named Person with FirstName, LastName, and BirthDate columns, and a user defined scalar function named usrFn_UTCToLocalTime. The sql statement sent to the server is:
SELECT [t0].[FirstName], [t0].[LastName], [t0].[BirthDate], CONVERT(DateTime,[dbo].[usrFn_UTCToLocalTime]([t0].[BirthDate])) AS [Dob]
FROM [dbo].[Person] AS [t0]
As I was suggesting in the question, for now I have overwritten the get method so I have:
get
{
using (var context = DB.Data.DataContextFactory.CreateContext())
{
return context.usrFn_UTCToLocalTime(_BirthDate);
}
//return this._BirthDate;
}
But with every access to the property, roundtrip is made - which is not my intention but gives a proper result.
I leave the question still open