My question is simple, I have two databases with the same scehema, one is live database say DLive and other one is testbed say DTestBed....
However, I want to use the same database namespace for both database. How can I achieve that without changing namespace in my code all over? Sometimes you need to do builds for live and testbeds in the same day ! Its really hard to change big project namespaces everytime you build.
How can I just change the webconfig connection string and get it done?
Thanks,
STEP 1:
Open 'Setting.ttinclude' from your Subsonic project..
STEP 2:
Add new vairable beneath 'const string DatabaseName'..
const string DatabaseObjectName = "DatabaseObjectName";// This is the object that you use for calling Stored Procedures, Tables and etc...
like this;
DatabaseObjectNameDB db = new DatabaseObjectNameDB();
STEP 3:
Now open 'ActiveRecord.tt', 'StoredProcedures.tt', 'Context.tt' files from your Subsonic project..
STEP 4:
Replace '<#=DatabaseName#>' with '<#=DatabaseObjectName#>' in above opened files...
STEP 5:
Now 'Run Custom Tools', by Righ-Click your Subsonic project...
Here you go...
Problem solved!!
Regards,
Naeem
Are you using SubSonic2 or three?
With SubSonic 3 it's as simple as this:
var db = new YourProductDB("connectionstringname");
var db = new YourProductDB("Server=localhost;Database=devdb;Uid=root;", "MySql.Data.MySqlClient");
for the first row you have to have both connection strings defined in your web.config/app.config
Related
I created some reports in Visual Studio 2015 with all the latest updates. However, when I try to deploy the reports I get this message:
The definition of this report is not valid or supported by this version of Reporting Services.
11:40:28 Error
The report definition may have been created with a later version of Reporting Services, or contain content that is not
11:40:28 Error
well-formed or not valid based on Reporting Services schemas. Details: The report definition has an invalid target
11:40:28 Error
namespace 'http://schemas.microsoft.com/sqlserver/reporting/2016/01/reportdefinition' which cannot be upgraded.
The first lines of the .rdl file are set up like this:
<?xml version="1.0" encoding="utf-8"?>
<Report MustUnderstand="df"
xmlns="http://schemas.microsoft.com/sqlserver/reporting/2016/01/reportdefinition"
xmlns:rd="http://schemas.microsoft.com/SQLServer/reporting/reportdesigner"
xmlns:df="http://schemas.microsoft.com/sqlserver/reporting/2016/01/reportdefinition/defaultfontfamily">
Can I change the schema definition? If so, to what? I tried just changing 2016 to 2014 or 2012, but neither worked.
Is there a place I can go to see valid definitions?
I actually ran into a similar problem where a change I needed to make resulted in an "Undocumented Error/Invalid RDL Structure" error in 2016, so I edited the RDL file so I could open it in an earlier version and make my changes. Not too hard, but you need to make a couple of tag edits.
For new reports you should probably just use an older version, but for existing reports you can do this: (I reverted to 2008)
Change the Report tag:
Remove MustUnderstand="df"
Change the xmlns value to "http://schemas.microsoft.com/sqlserver/reporting/2008/01/reportdefinition"
Delete the xmlns:df attribute.
Delete the entire "ReportParametersLayout" block.
Delete the "df" tag and its content.
Delete the "ReportSections" and "ReportSection" opening and closing tags (not the content).
Actually wrote some superhackish code to do this as part of a blog post, but the manual edit is simple enough.
The settings below should be set to your sepecific version of SSRS, and then take the RDL from the \bin directory
Or, after updating the TargetServerVersion, simply use right click | deploy from the rdl.
The accepted answer is significantly more difficult/prone to error/unlikely to work across multiple versions of ssrs, and needs to be applied each time you change the rdl.
I had the same issue when switching to VS2017 and installed Report Designer Version 14.2.
For me only 3 steps needed to fix the issue.
1: Set Change the xmlns to "http://schemas.microsoft.com/sqlserver/reporting/2008/01/reportdefinition"
2: Remove ReportSections" and "ReportSection" (Only Tags).
3: Remove report ReportParametersLayout section.
The only thing you need to memorize is to point xmlns to 2008/01
Other 2 steps can be seen in the error message after you change to 2008/01 and try to run the report.
If you are having trouble in a Visual Studo 2017 C# desktop application with LocalReport (RDLC), please see this answer:
https://stackoverflow.com/a/45149488/6732525
I recently ran into this issue as well. I found that I only needed to change two items in the .rdl file in question.
Change FROM:
Report xmlns="http://schemas.microsoft.com/sqlserver/reporting/2016/01/reportdefinition" xmlns:rd="http://schemas.microsoft.com/SQLServer/reporting/reportdesigner"
TO:
Report xmlns:rd="http://schemas.microsoft.com/SQLServer/reporting/reportdesigner" xmlns:cl="http://schemas.microsoft.com/sqlserver/reporting/2010/01/componentdefinition" xmlns="http://schemas.microsoft.com/sqlserver/reporting/2010/01/reportdefinition"
Unlike other responses, I needed 2010 instead of 2008. I would check an .rdl file that you have already deployed.
Remove the "ReportParametersLayout" block.
Note: If I removed ReportSections block, it did not work as others have noted.
I ran in to same problem and this is how I solved it,
Set the "TargetServerVersion" property on report project properties to be your old version of reporting server.
Build the project.
Get the report in the bin folder and deploy to the old reporting server.
Your source reports format and namespace will be updated to latest version. But bin folder reports will be build to be compatible with targeted reporting server version.
I have automated this task.
create a form with a textbox named "TextBoxFile" and a button.
In the code of the click button:
Dim xmlDoc As New XmlDocument()
xmlDoc.Load(TextBoxFile.Text)
Dim root = xmlDoc.DocumentElement
For Each elel As XmlNode In root.ChildNodes
Debug.WriteLine(elel.Name & " " & elel.NodeType)
Next
If root.Attributes()("xmlns").Value <> "http://schemas.microsoft.com/sqlserver/reporting/2008/01/reportdefinition" Then
root.Attributes()("xmlns").Value = "http://schemas.microsoft.com/sqlserver/reporting/2008/01/reportdefinition"
End If
Dim nsmgr = New XmlNamespaceManager(xmlDoc.NameTable)
nsmgr.AddNamespace("bk", "http://schemas.microsoft.com/sqlserver/reporting/2008/01/reportdefinition")
Dim autoRefreshElements = root.GetElementsByTagName("AutoRefresh")
While autoRefreshElements.Count > 0
root.RemoveChild(autoRefreshElements(0))
End While
Dim ReportParametersLayout = root.GetElementsByTagName("ReportParametersLayout")
While ReportParametersLayout.Count > 0
root.RemoveChild(ReportParametersLayout(0))
End While
Dim ReportSections = root.GetElementsByTagName("ReportSections")
If ReportSections.Count > 0 Then
' Move content of ReportSections just below the block.
Dim ReportSection = ReportSections(0).ChildNodes()
' First, copy the elements after
Dim precedent = ReportSections(0)
For Each child As XmlNode In ReportSection(0).ChildNodes
Dim clone = child.Clone
root.InsertAfter(clone, precedent)
precedent = clone
Next
' After deleting the existing block
While ReportSections.Count > 0
root.RemoveChild(ReportSections(0))
End While
End If
xmlDoc.Save(TextBoxFile.Text)
MsgBox("Ok")
The most simple and straight forward solution. I would suggest you to find Microsoft.ReportingServices.ReportViewerControl.WebForms in Manage NuGet Packages of the current project and update this dll version to latest version.
Navigate from VS menu: Tools > NuGet Package Manager > Manage NuGet Packages for Solution
Login through the local admin account and correct computer objects by deleting and creating those computer objects.
I've done a few searches here, and while some issues are similar, they don't seem to be exactly what I need.
What I'm trying to do is import an Excel file into a SQL table via SSIS, but the problem is that I will never know the exact filename. We get files at no steady interval, and the file usually has a date/month in the name. For instance, our current file is "Census Data - May 2013.xls". We will only ever load ONE file at a time, so I don't need to loop through a directory for multiple Excel files.
My concept is that I can take this file, copy it to a "Loading" directory, and load it from there. At the start of the package, I will first clear out the loading directory, then scan the original directory for an Excel file, copy it to the loading directory and then load it into SQL. I suppose I may have to store the file names somewhere so I don't copy the same file into the loading directory in subsequent months, but I'm not really sure of the best way to handle that.
I've pretty much got everything down except the part that scans the directory for the Excel file and copies it to the loading directory. I've taken the majority of my info from this page, which (again) is close to what I want to do but not quite exactly the solution I need.
Can anyone get me over the finish line? I can't seem to get the Excel Connection Manager right (this is my first time using variables), and I can't figure out how to get the file into the Loading directory.
Problem statement
How do I dynamically identify a file name?
You will require some mechanism to inspect the contents of a folder and see what exists. Specifically, you are looking for an Excel file in your "Loading" directory. You know the file extension and that is it.
Resolution A
Use a ForEach File Enumerator.
Configure the Enumerator with an Expression on FileSpec of *.xls or *.xlsx depending on which flavor of Excel you're dealing with.
Add another Expression on Directory to be your Loading directory.
I typically create SSIS Variables named FolderInput and FileMask and assign those in the Enumerator.
Now when you run your package, the Enumerator is going to look in Diretory and find all the files that match the FileSpec.
Something needs to be done with what is found. You need to use that file name that the Enumerator returns. That's done through the Variable Mappings tab. I created a third Variable called CurrentFileName and assign it the results of the enumerator.
If you put a Script Task inside the ForEach Enumerator, you should be able to see that the value in the "Locals" window for #[User::CurrentFileName] has updated from the Design time value of whatever to the "real" file name.
Resolution B
Use a Script Task.
You will still need to create a Variable to hold the current file name and it probably won't hurt to also have the FolderInput and FileMask Variables available. Set the former as ReadWrite and the latter as ReadOnly variables.
Chose the .NET language of your choice. I'm using C#. The method System.IO.Directory.EnumerateFiles
using System;
using System.Data;
using System.IO;
using Microsoft.SqlServer.Dts.Runtime;
using System.Windows.Forms;
namespace ST_fe2ea536a97842b1a760b271f190721e
{
[Microsoft.SqlServer.Dts.Tasks.ScriptTask.SSISScriptTaskEntryPointAttribute]
public partial class ScriptMain : Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTARTScriptObjectModelBase
{
public void Main()
{
string folderInput = Dts.Variables["User::FolderInput"].Value.ToString();
string fileMask = Dts.Variables["User::FileMask"].Value.ToString();
try
{
var files = Directory.EnumerateFiles(folderInput, fileMask, SearchOption.AllDirectories);
foreach (string currentFile in files)
{
Dts.Variables["User::CurrentFileName"].Value = currentFile;
break;
}
}
catch (Exception e)
{
Dts.Events.FireError(0, "Script overkill", e.ToString(), string.Empty, 0);
}
Dts.TaskResult = (int)ScriptResults.Success;
}
enum ScriptResults
{
Success = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Success,
Failure = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Failure
};
}
}
Decision tree
Given the two resolutions to the above problem, how do you chose? Normally, people say "It Depends" but there only possible time it would depend is if the process should stop/error out in the case that more than one file did exist in the Loading folder. That's a case that the ForEach enumerator would be more cumbersome than a script task. Otherwise, as I stated in my original response that adds cost to your project for Development, Testing and Maintenance for no appreciable gain.
Bits and bobs
Further addressing nuances in the question: Configuring Excel - you'll need to be more specific in what isn't working. Both Siva's SO answer and the linked blogspot article show how to use the value of the Variable I call CurrentFileName to ensure the Excel File is pointing to the "right" file.
You will need to set the DelayValidation to True for both the Connection Manager and the Data Flow as the design-time value for the Variable will not be valid when the package begins execution. See this answer for a longer explanation but again, Siva called that out in their SO answer.
This must be something very simple, I just don't see it (and can not find the answer :(
I am trying to learn DevExpress controls and have read that eXpress Persistent Objects is recommended for O/R mapping.
1) I have an existing SQL Server Compact 4.0 database for which I generated ORM
2) I have a Winform with XtraGrid.GridControl gridControl1
3) In Form_Load event I have this code:
XPCollection cName = new XPCollection(typeof(WindowsFormsApplication1.DUzskv1r6.XPO_TableName));
int c = cName.Count; //didn't help...
cName.DisplayableProperties = "Name;Nr"; //choose columns to display
gridControl1.MainView.PopulateColumns();
gridControl1.DataSource = cName;
I have read that it using "delayed loading" - loading when it is necessary (http://documentation.devexpress.com/#XPO/clsDevExpressXpoXPCollectiontopic), but reading XPcollections record Count didn't do the trick as it was suggested.
As a result I get an empty gridControl1 with columns "Name" and "Nr".
Please help - what am I missing?
I think the issue is somewhere in your datalayer initialization.
You use XPCollection with default session, maybe you forgot to initialize it.
The best way is to specify the session is in the XPCollection contractor.
I have been using PyroCMS and CI for quite some time, and truly love it.
I am extending a DB module that will allow an admin user to manage a DB without having to use something like phpMyAdmin.
The only thing I have been able to get working however is Browsing a table's field values (i.e 'SELECT * FROM 'table_name').
I want to include more functions, but I can't seem to get dbforge to work properly. I know it is loaded because dbforge is used to uninstall modules. I also get no error when calling functions from it.
Here is an example of my code from the controller (dbforge has already been loaded).
public function drop($table_name)
{
$table_name = $this->uri->segment(4);
$this->dbforge->drop_table($table_name);
redirect('admin/database/tables');
}
Lets say the function gets called from this url:
.../admin/database/drop/table_name
It appears to work... but instead it just redirects to the tables overview.
Is there something I am missing? Shouldn't [$this->dbforge->drop_table($table_name);] always drop a table (given $table_name is valid)?
EDIT
As a work around, I was able to use:
public function drop($table_name)
{
$table_name = $this->uri->segment(4);
//$this->dbforge->drop_table($table_name);
$this->db->query("DROP TABLE ".$table_name);
redirect('admin/database/tables');
return TRUE;
}
I really would like to use DB forge, however...
I think you might be getting a little confused by the site prefixes in PyroCMS 1.3.x.
By default all installations of Community and Professional will have default_ as a prefix for all tables in the first site. If you have Professional you can add new sites and the site reference will be whatever_ instead of default_
This prefix is accounted for by dbforge, so when you want to delete default_blog you would just delete:
/admin/database/drop/blog
Also, why are you accepting the $table_name as an argument then overriding it with a uri segment?
Also, why are you accepting the $table_name as an argument then overriding it with a uri segment?
See what I did there? xD
public function drop($table_name)
{
$this->dbforge->drop_table($table_name);
redirect('admin/database/tables');
}
I have a Wordpress site that uses two databases -- one section queries one database ("database_A"), and then Wordpress makes its connection to its own database ("database_B").
Everything it working well until I go to call this function:
$pageposts = $wpdb->get_results($querystr, OBJECT);
The Wordpress suddenly selects the wrong database ("database_A") when it was just using ("database_B").
How do I (a) prevent it from selecting ("database_A") or (b) make a call to have it select ("database_B")?
The wpdb class in WP ha a select() method. You should just be able to call it directly.
$wpdb->select('database_B');
You could also instantiate a second object that uses database_b:
$wpdb_b = new wpdb($db_b_user, $db_b_pwd, 'database_B', $db_b_host);
You can create a new $wpdb-var, like this:
<?php
$wpdb2 = new wpdb($user, $dbpassword, $db2, $dbhost);
?>
Now you can easily select items from the other database:
<?php
$pageposts = $wpdb2->get_results($querystr, OBJECT);
?>
I hope it helps you :]
(edit: Are you sure it suddenly changes the database? I mean, is it using database A before it is using database B, that's almost impossible...)