c# - executereader - sqldatareader read
Leyendo una fecha usando DataReader (8)
Leí una cadena usando este formato con un lector de datos. ¿Cómo puedo leer en una fecha usando un formato similar?
while (MyReader.Read())
{
TextBox1.Text = (string)MyReader["Note"];
}
En mi caso, cambié el campo de fecha y hora en la base de datos SQL para no permitir el nulo. SqlDataReader luego me permitió emitir el valor directamente a DateTime.
Esto puede parecer un poco fuera de tema, pero esta fue la publicación que encontré al preguntarme qué sucede cuando lee una columna como fecha y hora en c #. La publicación refleja la información que me hubiera gustado poder encontrar sobre este mecanismo. Si te preocupas por utc y zonas horarias, sigue leyendo
Investigué un poco más, ya que siempre desconfío de DateTime como clase debido a sus suposiciones automáticas sobre qué zona horaria está utilizando y porque es demasiado fácil confundir las horas locales y las horas locales.
Lo que estoy tratando de evitar aquí es que DateTime va ''oh, mira la computadora en la que me ejecutan está en la zona horaria x, por lo tanto, esta vez también debe estar en la zona horaria x, cuando me pidan mis valores, responderé como si Estoy en esa zona horaria ''
Estaba tratando de leer una columna de datetime2
.
La fecha en que regresará del servidor SQL será de tipo Kind.Unspecified
esto parece significar que se trata como UTC, que es lo que quería.
Al leer una columna de date
, también tiene que leerla como DateTime
, aunque no tiene tiempo y es más propensa a arruinar por zonas horarias (como es la medianoche).
Sin duda, considero que esta es una forma más segura de leer el DateTime, ya que sospecho que puede ser modificado por la configuración en el servidor SQL o la configuración estática en su c #:
var time = reader.GetDateTime(1);
var utcTime = new DateTime(time.Ticks, DateTimeKind.Utc);
Desde allí puede obtener los componentes (día, mes, año), etc. y formatear como desee.
Si lo que tienes es en realidad una fecha + una hora, entonces Utc podría no ser lo que quieres allí, ya que estás perdiendo el tiempo en el cliente, es posible que tengas que convertirlo primero a una hora local (según el significado de la hora). ). Sin embargo, eso abre toda una lata de gusanos ... Si necesita hacer eso, le recomiendo usar una biblioteca como noda time . Hay TimeZoneInfo
en la biblioteca estándar, pero después de investigarlo brevemente, no parece tener un conjunto adecuado de zonas horarias . Puede ver la lista proporcionada por TimeZoneInfo
utilizando el método TimeZoneInfo.GetSystemTimeZones();
También descubrí que SQL Server Management Studio no convierte los tiempos a la hora local antes de mostrarlos. Que es un alivio!
Prueba como se indica a continuación:
while (MyReader.Read())
{
TextBox1.Text = Convert.ToDateTime(MyReader["DateField"]).ToString("dd/MM/yyyy");
}
en el método ToString()
puede cambiar el formato de los datos según su requisito.
Sé que esta es una pregunta antigua, pero me sorprende que ninguna respuesta mencione GetDateTime
:
Obtiene el valor de la columna especificada como un objeto
DateTime
.
Que puedes usar como:
while (MyReader.Read())
{
TextBox1.Text = MyReader.GetDateTime(columnPosition).ToString("dd/MM/yyyy");
}
Si la columna de la consulta tiene un tipo apropiado, entonces
var dateString = MyReader.GetDateTime(MyReader.GetOrdinal("column")).ToString(myDateFormat)
Si la columna de la consulta es en realidad una cadena, vea otras respuestas.
/// <summary>
/// Returns a new conContractorEntity instance filled with the DataReader''s current record data
/// </summary>
protected virtual conContractorEntity GetContractorFromReader(IDataReader reader)
{
return new conContractorEntity()
{
ConId = reader["conId"].ToString().Length > 0 ? int.Parse(reader["conId"].ToString()) : 0,
ConEmail = reader["conEmail"].ToString(),
ConCopyAdr = reader["conCopyAdr"].ToString().Length > 0 ? bool.Parse(reader["conCopyAdr"].ToString()) : true,
ConCreateTime = reader["conCreateTime"].ToString().Length > 0 ? DateTime.Parse(reader["conCreateTime"].ToString()) : DateTime.MinValue
};
}
O
/// <summary>
/// Returns a new conContractorEntity instance filled with the DataReader''s current record data
/// </summary>
protected virtual conContractorEntity GetContractorFromReader(IDataReader reader)
{
return new conContractorEntity()
{
ConId = GetValue<int>(reader["conId"]),
ConEmail = reader["conEmail"].ToString(),
ConCopyAdr = GetValue<bool>(reader["conCopyAdr"], true),
ConCreateTime = GetValue<DateTime>(reader["conCreateTime"])
};
}
// Base methods
protected T GetValue<T>(object obj)
{
if (typeof(DBNull) != obj.GetType())
{
return (T)Convert.ChangeType(obj, typeof(T));
}
return default(T);
}
protected T GetValue<T>(object obj, object defaultValue)
{
if (typeof(DBNull) != obj.GetType())
{
return (T)Convert.ChangeType(obj, typeof(T));
}
return (T)defaultValue;
}
(DateTime)MyReader["ColumnName"];
O
Convert.ToDateTime(MyReader["ColumnName"]);
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Data.SqlClient;
namespace Library
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
}
private void textBox1_TextChanged(object sender, EventArgs e)
{
}
private void button1_Click(object sender, EventArgs e)
{
SqlConnection con = new SqlConnection(@"Data Source=(LocalDB)/MSSQLLocalDB;AttachDbFilename=C:/Users/NIKHIL R/Documents/Library.mdf;Integrated Security=True;Connect Timeout=30");
string query = "INSERT INTO [Table] (BookName , AuthorName , Category) VALUES(''" + textBox1.Text.ToString() + "'' , ''" + textBox2.Text.ToString() + "'' , ''" + textBox3.Text.ToString() + "'')";
SqlCommand com = new SqlCommand(query, con);
con.Open();
com.ExecuteNonQuery();
con.Close();
MessageBox.Show("Entry Added");
}
private void button3_Click(object sender, EventArgs e)
{
SqlConnection con = new SqlConnection(@"Data Source=(LocalDB)/MSSQLLocalDB;AttachDbFilename=C:/Users/NIKHIL R/Documents/Library.mdf;Integrated Security=True;Connect Timeout=30");
string query = "SELECT * FROM [TABLE] WHERE BookName=''" + textBox1.Text.ToString() + "'' OR AuthorName=''" + textBox2.Text.ToString() + "''";
string query1 = "SELECT BookStatus FROM [Table] where BookName=''" + textBox1.Text.ToString() + "''";
string query2 = "SELECT DateOfReturn FROM [Table] where BookName=''" + textBox1.Text.ToString() + "''";
SqlCommand com = new SqlCommand(query, con);
SqlDataReader dr, dr1,dr2;
con.Open();
com.ExecuteNonQuery();
dr = com.ExecuteReader();
if (dr.Read())
{
con.Close();
con.Open();
SqlCommand com1 = new SqlCommand(query1, con);
com1.ExecuteNonQuery();
dr1 = com1.ExecuteReader();
dr1.Read();
string i = dr1["BookStatus"].ToString();
if (i =="1" )
{
con.Close();
con.Open();
SqlCommand com2 = new SqlCommand(query2, con);
com2.ExecuteNonQuery();
dr2 = com2.ExecuteReader();
dr2.Read();
MessageBox.Show("This book is already issued/n " + "Book will be available by "+ dr2["DateOfReturn"] );
}
else
{
con.Close();
con.Open();
dr = com.ExecuteReader();
dr.Read();
MessageBox.Show("BookFound/n" + "BookName=" + dr["BookName"] + "/n AuthorName=" + dr["AuthorName"]);
}
con.Close();
}
else
{
MessageBox.Show("This Book is not available in the library");
}
}
private void button2_Click(object sender, EventArgs e)
{
SqlConnection con = new SqlConnection(@"Data Source=(LocalDB)/MSSQLLocalDB;AttachDbFilename=C:/Users/NIKHIL R/Documents/Library.mdf;Integrated Security=True;Connect Timeout=30");
string query = "SELECT * FROM [TABLE] WHERE BookName=''" + textBox1.Text.ToString() + "''";
string dateofissue1 = DateTime.Today.ToString("dd-MM-yyyy");
string dateofreturn = DateTime.Today.AddDays(15).ToString("dd-MM-yyyy");
string query1 = "update [Table] set BookStatus=1,DateofIssue=''"+ dateofissue1 +"'',DateOfReturn=''"+ dateofreturn +"'' where BookName=''" + textBox1.Text.ToString() + "''";
con.Open();
SqlCommand com = new SqlCommand(query, con);
SqlDataReader dr;
com.ExecuteNonQuery();
dr = com.ExecuteReader();
if (dr.Read())
{
con.Close();
con.Open();
string dateofissue = DateTime.Today.ToString("dd-MM-yyyy");
textBox4.Text = dateofissue;
textBox5.Text = DateTime.Today.AddDays(15).ToString("dd-MM-yyyy");
SqlCommand com1 = new SqlCommand(query1, con);
com1.ExecuteNonQuery();
MessageBox.Show("Book Isuued");
}
else
{
MessageBox.Show("Book Not Found");
}
con.Close();
}
private void button4_Click(object sender, EventArgs e)
{
SqlConnection con = new SqlConnection(@"Data Source=(LocalDB)/MSSQLLocalDB;AttachDbFilename=C:/Users/NIKHIL R/Documents/Library.mdf;Integrated Security=True;Connect Timeout=30");
string query1 = "update [Table] set BookStatus=0 WHERE BookName=''"+textBox1.Text.ToString()+"''";
con.Open();
SqlCommand com = new SqlCommand(query1, con);
com.ExecuteNonQuery();
string today = DateTime.Today.ToString("dd-MM-yyyy");
DateTime today1 = DateTime.Parse(today);
string query = "SELECT dateofReturn from [Table] where BookName=''" + textBox1.Text.ToString() + "''";
con.Close();
con.Open();
SqlDataReader dr;
SqlCommand cmd = new SqlCommand(query, con);
cmd.ExecuteNonQuery();
dr = cmd.ExecuteReader();
dr.Read();
string DOR = dr["DateOfReturn"].ToString();
DateTime dor = DateTime.Parse(DOR);
TimeSpan ts = today1.Subtract(dor);
string query2 = "update [Table] set DateOfIssue=NULL, DateOfReturn=NULL WHERE BookName=''" + textBox1.Text.ToString() + "''";
con.Close();
con.Open();
SqlCommand com2 = new SqlCommand(query2, con);
com2.ExecuteNonQuery();
int x = int.Parse(ts.Days.ToString());
if (x > 0)
{
int fine = x * 5;
textBox6.Text = fine.ToString();
MessageBox.Show("Book Received/nFine=" + fine);
}
else
{
textBox6.Text = "0";
MessageBox.Show("Book Received/nFine=0");
}
con.Close();
}
}
}