Good afternoon, whatever your timezone is ..
My question is,
Is there a way to select all tables? just like how we select all columns?
Something like
Dim cmdsql As String = "SELECT * FROM *"
Situation:
I have 4 tables inside the database ("which I would not know the names if my client changes it") So I need a better way how to do those.
I wanna SELECT all the columns, FROM all the tables store it in a dataset, so I can iterate
if it matches the search criteria.
EDIT: This is my search code by the way.
SearchDataset.Clear()
lstSearchResults.Items.Clear()
btnSearch.Enabled = False
Dim cmdsql As String = "SELECT * FROM *" '- This variable holds the SQL command.
'-----------------------------------------
' Connect to the current connection string
'----------------------------------------
SYSTEM_MainClient.dbcon.Open()
'-----------------------------------------
' Setup the Where Clause
'----------------------------------------
If cboSearchBy.Text = "StudentID" Then
SearchAdapter = New OleDb.OleDbDataAdapter(cmdsql + " WHERE " + cboSearchBy.Text + " = " + txtSearchbox.Text, SYSTEM_MainClient.dbcon)
ElseIf cboSearchBy.Text = "Age" Then
SearchAdapter = New OleDb.OleDbDataAdapter(cmdsql + " WHERE " + cboSearchBy.Text + " = " + txtSearchbox.Text, SYSTEM_MainClient.dbcon)
Else
SearchAdapter = New OleDb.OleDbDataAdapter(cmdsql + " WHERE " + cboSearchBy.Text + " like '" + txtSearchbox.Text + "'", SYSTEM_MainClient.dbcon)
End If
SearchAdapter.Fill(SearchDataset, "SearchResults")
SYSTEM_MainClient.dbcon.Close()
If SearchDataset.Tables("SearchResults").Rows.Count > 0 Then
For i = 0 To SearchDataset.Tables("SearchResults").Rows.Count - 1
lstSearchResults.Items.Add(SearchDataset.Tables("SearchResults").Rows(i).Item("Last_Name").ToString + ", " + SearchDataset.Tables("SearchResults").Rows(i).Item("First_Name").ToString)
Next
Else
SYSTEM_MainClient.ShowInformation("No records matched with the search '" + txtSearchbox.Text + "'.", "Database Search")
txtSearchbox.Clear()
End If
btnSearch.Enabled = True
Basically what I want to happen, select all from all tables, and fill it in the dataset and iterate inside the dataset if there are matching result names based on the search criteria with my where clause.
Here this Is the code to select all the tables from the ms access database
SELECT MSysObjects.Name AS table_name FROM MSysObjects
WHERE (((Left([Name],1))<>"~") AND ((Left([Name],4))<>"MSys") AND ((MSysObjects.Type) In (1,4,6)))
order by MSysObjects.Name
Making some alteration to this query will help to select columns of table
Related
I have a task of loading data from a .txt file to SQL Server table using Script Component in SSIS. I have loaded that successfully using a script.
public void Main()
{
//Declare Variables
string SourceFolderPath = Dts.Variables["$Project::Landing_Zone"].Value.ToString();
string FileExtension = Dts.Variables["User::FileExtension"].Value.ToString();
string FileDelimiter = Dts.Variables["User::FileDelimiter"].Value.ToString();
string ArchiveFolder = Dts.Variables["User::ArchiveFolder"].Value.ToString();
string ColumnsDataType = Dts.Variables["User::ColumnsDataType"].Value.ToString();
string SchemaName = Dts.Variables["$Project::SchemaName"].Value.ToString();
//Reading file names one by one
string[] fileEntries = Directory.GetFiles(SourceFolderPath, "*" + FileExtension);
foreach (string fileName in fileEntries)
{
SqlConnection myADONETConnection = new SqlConnection();
myADONETConnection = (SqlConnection)(Dts.Connections["DBConn"].AcquireConnection(Dts.Transaction) as SqlConnection);
//Writing Data of File Into Table
string TableName = "";
int counter = 0;
string line;
string ColumnList = "";
//MessageBox.Show(fileName);
System.IO.StreamReader SourceFile =
new System.IO.StreamReader(fileName);
while ((line = SourceFile.ReadLine()) != null)
{
if (counter == 0)
{
ColumnList = "[" + line.Replace(FileDelimiter, "],[") + "]";
TableName = (((fileName.Replace(SourceFolderPath, "")).Replace(FileExtension, "")).Replace("\\", ""));
string CreateTableStatement = "IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[" + SchemaName + "].";
CreateTableStatement += "[" + TableName + "]')";
CreateTableStatement += " AND type in (N'U'))DROP TABLE [" + SchemaName + "].";
CreateTableStatement += "[" + TableName + "] Create Table " + SchemaName + ".[" + TableName + "]";
CreateTableStatement += "([" + line.Replace(FileDelimiter, "] " + ColumnsDataType + ",[") + "] " + ColumnsDataType + ")";
SqlCommand CreateTableCmd = new SqlCommand(CreateTableStatement, myADONETConnection);
CreateTableCmd.ExecuteNonQuery();
//MessageBox.Show(CreateTableStatement);
}
else
{
string query = "Insert into " + SchemaName + ".[" + TableName + "] (" + ColumnList + ") ";
query += "VALUES('" + line.Replace(FileDelimiter, "','") + "')";
// MessageBox.Show(query.ToString());
SqlCommand myCommand1 = new SqlCommand(query, myADONETConnection);
myCommand1.ExecuteNonQuery();
}
counter++;
}
SourceFile.Close();
}
}
Package Variable Details
But the problem is that I could load all the values from the text file to the table only with a single data type(I used nvarchar(200) as a common data type for all values). I have passed nvarchar(200) as a value in one of the package variable and I have called that in the script.
I am expecting the script component to assign a DataType to the columns by understanding the values available in the text file.
Example: The text file which I loaded into the table has got the following data.
Id,Name,Age
1,Arun,25
2,Ramesh,26
3,Anish,28
As a result a table with the name dbo.File_1 is created with columns Id, Name and Age. But all the these columns are created with the same datatype nvarchar(200) as mentioned previously.
But my requirement is that the script component should assign data types based on the values, say for example, The Column Id should be assigned with datatype int, Name should be assigned with datatype nvarchar(50) and so on. Likewise the script should assign datatypes based on any kind of values(Like Decimal, Date etc)
Is there any possible way to achieve this? Thanks in advance.
Additional Hint:
This script normally Drop and Create a new table everytime during the execution. The table name is based on the FileName.
This is shooting from the hip on this one, but maybe using tryparse:
col += int.TryParse(ID, out num)? "int" : "nvarchar(200)";
I need to access data from a table. I have used the code like this:
string sql = "select * from bikesold "
+ "where model = '"+model+"'
+ "and mnth = '"+mnth+"' ";
The error is coming as follows:
ORA-00904: "MNTH": invalid identifier.
All the database connections are ok. I just need to confirm the Syntax for this code.
string sql = "select * from bikesold "
+ "where model = '"+model+"'"
+ "and mnth = '"+mnth+"' ";
you have missed the double quote in 2nd string.
For starters, your string is wrong. Try this instead:
string sql = "select * from bikesold "
+ "where model = '"+ model +
+ "' and mnth = '"+ mnt + "'";
Q: Does your table actually have a column named "mnth'?
I could use your advice on an approach for copying data between tables. I'm really trying to avoid RDBMS-specific SQL... The 2 tables are the same in all respects except name.
Concept:
My application uses data from a table (let's call it TableA). But this reference data changes almost daily, so I want to copy yesterday's off to make room for toady's data.
Right now, I use SMO to make an exact copy of TableA (schema), with unique (using date) names for the table, indices, keys, etc. No problemo. If there are any problems updating TableA with today's data, I can always restore yesterday's TableA (TableA_<yesterdayDate>). Both tables are on the same database.
I can't just use SMO's .rename, because it won't rename all the keys & indices...
So much for the premise.
Desired:
A non-SQL statement way to do so. I am heavily invested in EF6/Code First in this application, but as the name of the table changes each day, I can't just add tables/classes in DbContext 'just in case'.
I just feel so dirty using low level SQL...
SQL Server 2012
VB2012
EF6/Code First
P.S. I've tried a few times in the past to implement SQL statements (LINQ-ish) via the DbContext, and never got it to work-especially for SPs.
I can't find a cleaner way to do this. I tried to encapsulate all the logic into a single Function that returns a boolean on success/failure. Please orgive the roughness of the code!
NewTableName is just OldTableName_YYYMMDD. I could have used "SourceTableName", but this is just the first hack at it.
Public Function MoveAllRowsToNewTable(OldTableName As String, NewSchemaName As String, NewTableName As String, IndexColumnName As String) As Boolean
' OldTableName = "TableA", "TableB", ...
' NewSchemaName = "dbo"
' NewTableName = "TableA_20140325", etc.
' IndexColumnName = "ID" in my case, but whatever col is needed
'
Try
'===
'
' DROP target table (if exist)
'
If Me.DoesTableExist(NewSchemaName, NewTableName) Then
Dim CmdQ = Me.ctx.Database.ExecuteSqlCommand("DROP TABLE " & NewSchemaName & "." & NewTableName)
log.Debug("DROPPED TABLE " & NewTableName)
Else
NewTableName = NewSchemaName & "." & NewTableName
log.Debug("New table name: " & NewTableName)
End If
'
Dim numRows As Int32 = 0 ' holds # of rows in SourceTable to check if copy OK
Select Case OldTableName
Case "TableA"
Try
'===
'
' Count rows in source table
'
numRows = (Me.ctx.TableA).Count
'
'===
'
' Copy rows in source table, creating new table in the process
'
CmdQ = "SELECT * INTO " & NewTableName & " FROM " & OldTableName
Me.ctx.Database.ExecuteSqlCommand(CmdQ)
'
' create PK
'
Dim PKQ As String = "ALTER TABLE " & NewTableName & " ADD CONSTRAINT PK_" & NewTableName & "_ID PRIMARY KEY CLUSTERED (ID)"
CmdQ = ctx.Database.ExecuteSqlCommand(PKQ.ToString)
'
' create index
'
Dim NewTableIndexName As String = "idx_" & NewTableName.Replace(".", "_") ' indices can't have a '.' in them
Dim IdxQ As String = "CREATE INDEX " & NewTableIndexName & " ON " & NewTableName & " (" & IndexColumnName & ");"
CmdQ = ctx.Database.ExecuteSqlCommand(IdxQ.ToString)
'
' verify rows copied
'
Dim RowQ As Int32 = Me.ctx.Database.SqlQuery(Of Int32)("SELECT COUNT(*) AS rows FROM " & NewTableName).FirstOrDefault
log.Debug("TargetTableRows: " & RowQ.ToString)
If numRows = RowQ Then
log.Debug("MATCH!" & RowQ)
Else
log.Debug("NO MATCH! numRows: " & numRows & " RowQ: " & RowQ)
'
' rollback the move-the copy FAILED!
'
' XXX to-do
End If
Catch ex As Exception
[...]
End Try
'
Case "TableB"
[...]
I only have 3 source tables, so a Switch/Case is very practical in this early stage...
I'm still open to ideas, but I dug as far as I could, and I have to move on. Maybe I'll re-visit it something more elegant comes along!
I have a search page that returns results according to the criteria nominated and this works ok when each criteria is OR but when I use AND it returns bad or no results. For example the search criteria might be...
A. Author = ""
B. Subject = ""
C. Keyword = ""
D. Dated = ""
Code:
SELECT *
FROM Table
WHERE Author = '" & strAuthor & "'
AND Subject = '" & strSubject & "'
AND Keyword = '" & strKeyword & "'
AND Dated = '" & strDated & "' "
Here I have used only 4 parameters whereas in fact there are quite a few more. But the example should explain the problem... to make this work I would need to be more specific such as "if A and B" or "B, C and D" but using any parameters that are blank or NULL will not work.
Now I could write in the criteria using a conditional statement like...
SELECT *
FROM Table
WHERE
if strAuthor <> "" then
Author = '" & strAuthor & "'
end if
if strSubject <> "" then
AND Subject = '" & strSubject & "'
end if
and so on, except that writing SELECT strings like this does not work, just produces errors because the select string cannot contain additional code (that has been my finding).
If the options were only a few I could write separate select strings for each combination, but there are more than 10 different criteria which entail more than 3,628,800 combinations!
Is there a solution for this?
Here you are having 2 options:
a) Create a stored procedure and have some default value for all the columns, and in case if user doesn't pass any value, the query would run with the default value for that column.
b) Impose the rule on the front end to always select a value for all the columns.
No stored procedures are needed when using this code:
SQL = "SELECT * FROM Table WHERE ID <> ''"
if len(strAuthor) > 3 then
SQL = SQL & " AND Author = '" & strAuthor & "'"
end if
if len(strSubject) > 3 then
SQL = SQL & " AND Subject LIKE '%" + Replace(strSubject, "'", "''") + "%'"
end if
if len(strKeyword) > 3 then
SQL = SQL & " AND Description LIKE '%" + Replace(strKeyword, "'", "''") + "%'"
end if
if strCatID <> "" then
SQL = SQL & " AND Category = '" & strCatID & "'"
end if
SQL = SQL & " Order By Subject ASC "
The significance of the first line where it requests ID is to serve as a generic placeholder so that all following parameters can be prefixed with "AND".
If a variable is empty it is not included, so only those specified are used.
I have an Invoice that I need to move from Pending Sales
to a Sale Journal, at the end of year to a Master Sale Journal.
Old quotes get moved to a Quote Archive as well. Quotes and Invoices
from the Sale Journal can be moved back to Pending Sales.
I want to build a class that I can pass the source and destination tables
to and move the invoice in and out of.
I have never done a Stored Procedure or pass the adapterTable to a procedure
either.
I am not sure what is the best method to approach a seedy solution is.
I am thinking a stored procedure is the way to go, but how to do a Fill and Insert?
Ideas? code examples?
Started playing with this, but not even close to a good sstart
SqlDataAdapter daPASQS = new SqlDataAdapter("SELECT * FROM " + "VF_PasQS" + " WHERE (calendar_year = " + year + ") and (inv_no_ =" +
InvNo + ") and (s = " + Series + "}", pasps);
DataSet dsPASQS = new DataSet();
daPASPR.TableMappings.Add("vf_PASQS", "invNo");
daPASPR.Fill(dsPASQS, "invNo");
BindingSource myBinding = new BindingSource(dsPASQS, "invNo");
pasps.Close();
int invNo = 0;
foreach (DataRow row in dsPASQS.Tables[0].Rows)
{
invNo = (Int32)row["invNo"];
}
Thanks,
Jerry
Been playing with the following,
string str = "select * into VF_PASPS " +
"FROM vf_PASQS " +
"WHERE (calendar_year = '" + year + "') AND (inv_no_ = '" + InvNo + "') AND (s = '" + Series + "')";
but only creats a NEW TABLE. I need to add/append to an existing table
Thanks,
Jerry
You can use the SqlBulkCopy class